Merge remote-tracking branch 'origin/develop_liyi' into develop_liyi
This commit is contained in:
commit
b723d127f4
@ -115,12 +115,14 @@ android {
|
||||
applicationId "com.skychip.lock.pre"
|
||||
signingConfig signingConfigs.sky
|
||||
resValue "string", "app_name", "锁通通-P"
|
||||
manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock.pre"
|
||||
}
|
||||
sky_dev {
|
||||
dimension "flavor-type"
|
||||
applicationId "com.skychip.lock.dev"
|
||||
signingConfig signingConfigs.sky
|
||||
resValue "string", "app_name", "锁通通-D"
|
||||
manifestPlaceholders.JPUSH_PKGNAME = "com.skychip.lock.dev"
|
||||
}
|
||||
xhj {
|
||||
dimension "flavor-type"
|
||||
@ -135,12 +137,14 @@ android {
|
||||
applicationId "com.xhjcn.lock.pre"
|
||||
signingConfig signingConfigs.xhj
|
||||
resValue "string", "app_name", "星星锁-P"
|
||||
manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock.pre"
|
||||
}
|
||||
xhj_dev {
|
||||
dimension "flavor-type"
|
||||
applicationId "com.xhjcn.lock.dev"
|
||||
signingConfig signingConfigs.xhj
|
||||
resValue "string", "app_name", "星星锁-D"
|
||||
manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock.dev"
|
||||
}
|
||||
}
|
||||
|
||||
@ -290,4 +294,8 @@ dependencies {
|
||||
// implementation(name: 'HiPushSDK-7.0.61.303', ext: 'aar')
|
||||
//接入 VIVO 厂商
|
||||
implementation 'cn.jiguang.sdk.plugin:vivo:5.2.3'
|
||||
|
||||
// Umeng统计
|
||||
implementation 'com.umeng.umsdk:common:9.3.7'
|
||||
implementation 'com.umeng.umsdk:asms:1.4.1'
|
||||
}
|
||||
|
||||
@ -131,4 +131,9 @@
|
||||
-keep class com.tencent.mm.opensdk.** { *; }
|
||||
|
||||
-dontwarn com.tencent.bugly.**
|
||||
-keep public class com.tencent.bugly.**{*;}
|
||||
-keep public class com.tencent.bugly.**{*;}
|
||||
|
||||
-keep class com.umeng.** { *; }
|
||||
-keep class com.umeng.**$* { *; }
|
||||
-keep class com.umeng.message.** { *; }
|
||||
-keep class com.umeng.message.**$* { *; }
|
||||
@ -131,4 +131,9 @@
|
||||
-keep class com.tencent.mm.opensdk.** { *; }
|
||||
|
||||
-dontwarn com.tencent.bugly.**
|
||||
-keep public class com.tencent.bugly.**{*;}
|
||||
-keep public class com.tencent.bugly.**{*;}
|
||||
|
||||
-keep class com.umeng.** { *; }
|
||||
-keep class com.umeng.**$* { *; }
|
||||
-keep class com.umeng.message.** { *; }
|
||||
-keep class com.umeng.message.**$* { *; }
|
||||
7
android/app/proguard-rules.pro
vendored
7
android/app/proguard-rules.pro
vendored
@ -128,4 +128,9 @@
|
||||
}
|
||||
|
||||
-keep class com.tencent.mm.sdk.** { *; }
|
||||
-keep class com.tencent.mm.opensdk.** { *; }
|
||||
-keep class com.tencent.mm.opensdk.** { *; }
|
||||
|
||||
-keep class com.umeng.** { *; }
|
||||
-keep class com.umeng.**$* { *; }
|
||||
-keep class com.umeng.message.** { *; }
|
||||
-keep class com.umeng.message.**$* { *; }
|
||||
@ -56,6 +56,14 @@
|
||||
android:name="android.permission.QUERY_ALL_PACKAGES"
|
||||
tools:node="remove" />
|
||||
|
||||
<uses-permission android:name="com.hihonor.permission.sec.SDK_LAUNCHER" />
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
|
||||
<application
|
||||
android:name="android.app.Application"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
@ -171,6 +179,18 @@
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
<meta-data
|
||||
android:name="BUGLY_ENABLE_DEBUG"
|
||||
android:value="true" />
|
||||
|
||||
<!-- 添加 Umeng SDK 的服务 -->
|
||||
<service android:name="com.umeng.message.UmengIntentService" android:exported="false"/>
|
||||
<receiver android:name="com.umeng.message.NotificationProxyBroadcastReceiver" android:exported="true" android:permission="android.permission.BROADCAST_PACKAGE_REMOVED">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
|
||||
<data android:scheme="package"/>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
</application>
|
||||
|
||||
|
||||
|
||||
5
android/app/src/main/assets/umeng_config.xml
Normal file
5
android/app/src/main/assets/umeng_config.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<umeng_config>
|
||||
<appkey>671244cf80464b33f6df9648</appkey>
|
||||
<channel>Product</channel>
|
||||
</umeng_config>
|
||||
@ -12,10 +12,16 @@ import android.bluetooth.BluetoothAdapter;
|
||||
import androidx.core.content.FileProvider
|
||||
import java.io.File
|
||||
|
||||
import com.umeng.commonsdk.UMConfigure
|
||||
|
||||
class MainActivity : FlutterActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine!!)
|
||||
|
||||
// 初始化 Umeng SDK
|
||||
UMConfigure.init(this, "671244cf80464b33f6df9648", "Product", UMConfigure.DEVICE_TYPE_PHONE, null)
|
||||
|
||||
MethodChannel(flutterEngine?.dartExecutor!!.binaryMessenger, "starLockFlutterSend").setMethodCallHandler { call, result ->
|
||||
if (call.method == "loadNativeShare") {
|
||||
val map = call.arguments as Map<String, String>
|
||||
|
||||
BIN
images/main/icon_lockDetail_openLock_succeed.png
Normal file
BIN
images/main/icon_lockDetail_openLock_succeed.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
BIN
images/main/icon_main_remoteUnlocking_xhj.png
Normal file
BIN
images/main/icon_main_remoteUnlocking_xhj.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.2 KiB |
@ -1,6 +0,0 @@
|
||||
#include "Generated.xcconfig"
|
||||
|
||||
FLUTTER_TARGET=lib/main_sky_pre.dart
|
||||
ASSET_PREFIX=sky
|
||||
BUNDLE_NAME=锁通通-P
|
||||
BUNDLE_DISPLAY_NAME=锁通通-P
|
||||
@ -1,9 +0,0 @@
|
||||
//
|
||||
// preXhjDebug.xcconfig
|
||||
// Runner
|
||||
//
|
||||
// Created by Mac on 2024/12/2.
|
||||
//
|
||||
|
||||
// Configuration settings file format documentation can be found at:
|
||||
// https://help.apple.com/xcode/#/dev745c5c974
|
||||
@ -30,6 +30,9 @@ flutter_ios_podfile_setup
|
||||
|
||||
target 'Runner' do
|
||||
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
|
||||
|
||||
pod 'UMCommon'
|
||||
pod 'UMDevice'
|
||||
end
|
||||
|
||||
# Plugin Pods
|
||||
|
||||
@ -147,6 +147,13 @@ PODS:
|
||||
- system_settings (0.0.1):
|
||||
- Flutter
|
||||
- Toast (4.1.1)
|
||||
- UMCommon (7.4.7):
|
||||
- UMDevice
|
||||
- UMDevice (3.4.0)
|
||||
- umeng_common_sdk (0.0.1):
|
||||
- Flutter
|
||||
- UMCommon
|
||||
- UMDevice
|
||||
- url_launcher_ios (0.0.1):
|
||||
- Flutter
|
||||
- video_player_avfoundation (0.0.1):
|
||||
@ -193,6 +200,9 @@ DEPENDENCIES:
|
||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||
- sqflite (from `.symlinks/plugins/sqflite/darwin`)
|
||||
- system_settings (from `.symlinks/plugins/system_settings/ios`)
|
||||
- UMCommon
|
||||
- UMDevice
|
||||
- umeng_common_sdk (from `.symlinks/plugins/umeng_common_sdk/ios`)
|
||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
|
||||
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
|
||||
@ -219,6 +229,8 @@ SPEC REPOS:
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- Toast
|
||||
- UMCommon
|
||||
- UMDevice
|
||||
- WechatOpenSDK-XCFramework
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
@ -290,6 +302,8 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/plugins/sqflite/darwin"
|
||||
system_settings:
|
||||
:path: ".symlinks/plugins/system_settings/ios"
|
||||
umeng_common_sdk:
|
||||
:path: ".symlinks/plugins/umeng_common_sdk/ios"
|
||||
url_launcher_ios:
|
||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||
video_player_avfoundation:
|
||||
@ -351,11 +365,14 @@ SPEC CHECKSUMS:
|
||||
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||
system_settings: 8f5cdbfa72c677fc8d665b863bcc20d393d87e9d
|
||||
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
|
||||
UMCommon: 8b4cd0423297c39bca6eea1ec896558b40e5bcf7
|
||||
UMDevice: dcdf7ec167387837559d149fbc7d793d984faf82
|
||||
umeng_common_sdk: a8abd7f86dfd013dbbeeae587ee143760c6582f2
|
||||
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
|
||||
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
|
||||
webview_flutter_wkwebview: 2a23822e9039b7b1bc52e5add778e5d89ad488d1
|
||||
WechatOpenSDK-XCFramework: 36fb2bea0754266c17184adf4963d7e6ff98b69f
|
||||
|
||||
PODFILE CHECKSUM: 317f9473a5705c6fe4d79d95e81676f248048fdc
|
||||
PODFILE CHECKSUM: a4d4747e9f246a7c5b9d643d5efa33799112963a
|
||||
|
||||
COCOAPODS: 1.14.3
|
||||
|
||||
@ -7,8 +7,7 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
04FA4A8B2CFDADFF00A096E8 /* preSKyDebug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 04FA4A8A2CFDADFF00A096E8 /* preSKyDebug.xcconfig */; };
|
||||
04FA4A8D2CFDAE1C00A096E8 /* preXhjDebug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 04FA4A8C2CFDAE1C00A096E8 /* preXhjDebug.xcconfig */; };
|
||||
04D0CC262D06CE570042EF10 /* launchImage_xhj.png in Resources */ = {isa = PBXBuildFile; fileRef = 82B657662C919BDF0079121C /* launchImage_xhj.png */; };
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 35F02D170492750B437D6AB6 /* skyRelease.xcconfig */; };
|
||||
370C09E26790814FD1F6465F /* xhjLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6A6F5C86239927252C06A16A /* xhjLaunchScreen.storyboard */; };
|
||||
@ -18,8 +17,6 @@
|
||||
805C745A7C79091E65665B96 /* devDebug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 0D02C18E16914A687A4A1AC2 /* devDebug.xcconfig */; };
|
||||
8297E4102AE75AC500E886FA /* XSFlutterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E40E2AE75AC500E886FA /* XSFlutterManager.m */; };
|
||||
8297E49B2AE7974700E886FA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8297E49A2AE7974700E886FA /* AppDelegate.m */; };
|
||||
82B657622C91665F0079121C /* Info_sky.plist in Resources */ = {isa = PBXBuildFile; fileRef = 82B657602C91665E0079121C /* Info_sky.plist */; };
|
||||
82B657652C917F950079121C /* Info_pre.plist in Resources */ = {isa = PBXBuildFile; fileRef = 82B657642C917F950079121C /* Info_pre.plist */; };
|
||||
82B657692C919DA70079121C /* launchImage_sky.png in Resources */ = {isa = PBXBuildFile; fileRef = 82B657682C919DA60079121C /* launchImage_sky.png */; };
|
||||
82C026542AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */; };
|
||||
82F1ECDB2BE8B7B500265D59 /* DTFIdentityManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F1ECD12BE8B7B400265D59 /* DTFIdentityManager.framework */; };
|
||||
@ -75,6 +72,10 @@
|
||||
E0A496CB2CA30C7400E376BB /* xhjPreviewRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = E0A496CA2CA30C7400E376BB /* xhjPreviewRelease.xcconfig */; };
|
||||
E0A496CD2CA30CA900E376BB /* skyDevRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = E0A496CC2CA30CA900E376BB /* skyDevRelease.xcconfig */; };
|
||||
E0A496CF2CA30CEF00E376BB /* skyPreviewRelease.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = E0A496CE2CA30CEF00E376BB /* skyPreviewRelease.xcconfig */; };
|
||||
E0B3E9ED2D04B36C00907A95 /* info_xhj.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B3E9E92D04B36C00907A95 /* info_xhj.plist */; };
|
||||
E0B3E9EE2D04B36C00907A95 /* info_sky.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B3E9EA2D04B36C00907A95 /* info_sky.plist */; };
|
||||
E0B3E9EF2D04B36D00907A95 /* info_pre.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B3E9EB2D04B36C00907A95 /* info_pre.plist */; };
|
||||
E0B3E9F02D04B36D00907A95 /* info_dev.plist in Resources */ = {isa = PBXBuildFile; fileRef = E0B3E9EC2D04B36C00907A95 /* info_dev.plist */; };
|
||||
E2FF5D00DFF6E2BF9DA36649 /* devLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D627D69970E6DA2D33F770E3 /* devLaunchScreen.storyboard */; };
|
||||
EE0A7A61CF36BC83ACA6EE3E /* xhjProfile.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = DC2FBF181C8D9880E24845E6 /* xhjProfile.xcconfig */; };
|
||||
F0A7A6EF7D83CA92324D9C20 /* preDebug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 383F65C3166F78B1A1470A4E /* preDebug.xcconfig */; };
|
||||
@ -97,8 +98,6 @@
|
||||
/* Begin PBXFileReference section */
|
||||
0420903B2C0EEAA50073E654 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; };
|
||||
04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-xhj.entitlements"; sourceTree = "<group>"; };
|
||||
04FA4A8A2CFDADFF00A096E8 /* preSKyDebug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = preSKyDebug.xcconfig; path = Flutter/preSKyDebug.xcconfig; sourceTree = "<group>"; };
|
||||
04FA4A8C2CFDAE1C00A096E8 /* preXhjDebug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = preXhjDebug.xcconfig; path = Flutter/preXhjDebug.xcconfig; sourceTree = "<group>"; };
|
||||
0BEB3ADCCEC961E2916B9004 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
0D02C18E16914A687A4A1AC2 /* devDebug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = devDebug.xcconfig; path = Flutter/devDebug.xcconfig; sourceTree = "<group>"; };
|
||||
126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.dev-release-sky.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.dev-release-sky.xcconfig"; sourceTree = "<group>"; };
|
||||
@ -130,9 +129,6 @@
|
||||
8297E40F2AE75AC500E886FA /* XSFlutterManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XSFlutterManager.h; sourceTree = "<group>"; };
|
||||
8297E4992AE7974700E886FA /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
||||
8297E49A2AE7974700E886FA /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
|
||||
82B657602C91665E0079121C /* Info_sky.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info_sky.plist; sourceTree = "<group>"; };
|
||||
82B657612C91665E0079121C /* Info_xhj.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info_xhj.plist; sourceTree = "<group>"; };
|
||||
82B657642C917F950079121C /* Info_pre.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info_pre.plist; sourceTree = "<group>"; };
|
||||
82B657662C919BDF0079121C /* launchImage_xhj.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launchImage_xhj.png; sourceTree = "<group>"; };
|
||||
82B657682C919DA60079121C /* launchImage_sky.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = launchImage_sky.png; sourceTree = "<group>"; };
|
||||
82BD91212ADA72360018E523 /* CommonDefine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommonDefine.h; sourceTree = "<group>"; };
|
||||
@ -184,7 +180,6 @@
|
||||
97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info_dev.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info_dev.plist; sourceTree = "<group>"; };
|
||||
9A03C622761920C324D80733 /* skyLaunchScreen.storyboard */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.storyboard; name = skyLaunchScreen.storyboard; path = Runner/skyLaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
9AA145F8B894E5E4F14249DB /* devProfile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = devProfile.xcconfig; path = Flutter/devProfile.xcconfig; sourceTree = "<group>"; };
|
||||
A728CF82D2CACE8B399AACAB /* Pods-Runner.debug-pre-xhj.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-pre-xhj.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-pre-xhj.xcconfig"; sourceTree = "<group>"; };
|
||||
@ -205,6 +200,11 @@
|
||||
E0A496CA2CA30C7400E376BB /* xhjPreviewRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = xhjPreviewRelease.xcconfig; path = Flutter/xhjPreviewRelease.xcconfig; sourceTree = "<group>"; };
|
||||
E0A496CC2CA30CA900E376BB /* skyDevRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = skyDevRelease.xcconfig; path = Flutter/skyDevRelease.xcconfig; sourceTree = "<group>"; };
|
||||
E0A496CE2CA30CEF00E376BB /* skyPreviewRelease.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = skyPreviewRelease.xcconfig; path = Flutter/skyPreviewRelease.xcconfig; sourceTree = "<group>"; };
|
||||
E0B3E9D62D041C2D00907A95 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
E0B3E9E92D04B36C00907A95 /* info_xhj.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = info_xhj.plist; sourceTree = "<group>"; };
|
||||
E0B3E9EA2D04B36C00907A95 /* info_sky.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = info_sky.plist; sourceTree = "<group>"; };
|
||||
E0B3E9EB2D04B36C00907A95 /* info_pre.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = info_pre.plist; sourceTree = "<group>"; };
|
||||
E0B3E9EC2D04B36C00907A95 /* info_dev.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = info_dev.plist; sourceTree = "<group>"; };
|
||||
ED1F1A04428235FB1B6FD471 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
ED3A443EA1439FD0FB4BCF80 /* Pods-Runner.dev-release-xhj.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.dev-release-xhj.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.dev-release-xhj.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
@ -294,9 +294,9 @@
|
||||
2248834AC2C89C79BC3744F6 /* devRelease.xcconfig */,
|
||||
383F65C3166F78B1A1470A4E /* preDebug.xcconfig */,
|
||||
B7AA7A6DD927B38E32E2C889 /* preProfile.xcconfig */,
|
||||
D501929EA2295683612A3AD8 /* preRelease.xcconfig */,
|
||||
7579B06AEF5FEA95042D8474 /* skyDebug.xcconfig */,
|
||||
DC36296928F573892A6C154E /* skyProfile.xcconfig */,
|
||||
D501929EA2295683612A3AD8 /* preRelease.xcconfig */,
|
||||
35F02D170492750B437D6AB6 /* skyRelease.xcconfig */,
|
||||
853610C00A55CC450C2FF839 /* xhjDebug.xcconfig */,
|
||||
DC2FBF181C8D9880E24845E6 /* xhjProfile.xcconfig */,
|
||||
@ -306,8 +306,6 @@
|
||||
E0A496CA2CA30C7400E376BB /* xhjPreviewRelease.xcconfig */,
|
||||
E0A496CC2CA30CA900E376BB /* skyDevRelease.xcconfig */,
|
||||
E0A496CE2CA30CEF00E376BB /* skyPreviewRelease.xcconfig */,
|
||||
04FA4A8A2CFDADFF00A096E8 /* preSKyDebug.xcconfig */,
|
||||
04FA4A8C2CFDAE1C00A096E8 /* preXhjDebug.xcconfig */,
|
||||
);
|
||||
name = Flutter;
|
||||
sourceTree = "<group>";
|
||||
@ -343,11 +341,13 @@
|
||||
97C146F01CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
E0B3E9EC2D04B36C00907A95 /* info_dev.plist */,
|
||||
E0B3E9EB2D04B36C00907A95 /* info_pre.plist */,
|
||||
E0B3E9EA2D04B36C00907A95 /* info_sky.plist */,
|
||||
E0B3E9E92D04B36C00907A95 /* info_xhj.plist */,
|
||||
82B657682C919DA60079121C /* launchImage_sky.png */,
|
||||
82B657662C919BDF0079121C /* launchImage_xhj.png */,
|
||||
82B657642C917F950079121C /* Info_pre.plist */,
|
||||
82B657602C91665E0079121C /* Info_sky.plist */,
|
||||
82B657612C91665E0079121C /* Info_xhj.plist */,
|
||||
E0B3E9D62D041C2D00907A95 /* Info.plist */,
|
||||
04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */,
|
||||
82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */,
|
||||
8297E4992AE7974700E886FA /* AppDelegate.h */,
|
||||
@ -357,7 +357,6 @@
|
||||
33BF41252A96174D009D92E2 /* Runner.entitlements */,
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
||||
97C147021CF9000F007C117D /* Info_dev.plist */,
|
||||
97C146F11CF9000F007C117D /* Supporting Files */,
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
|
||||
@ -482,12 +481,13 @@
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
04D0CC262D06CE570042EF10 /* launchImage_xhj.png in Resources */,
|
||||
82F1ED1C2BE8BA8F00265D59 /* BioAuthEngine.bundle in Resources */,
|
||||
82B657692C919DA70079121C /* launchImage_sky.png in Resources */,
|
||||
82F1ED1A2BE8BA7D00265D59 /* OCRXMedia.bundle in Resources */,
|
||||
82F1ED182BE8BA6900265D59 /* APBToygerFacadeSuitable.bundle in Resources */,
|
||||
82F1ED162BE8BA2000265D59 /* APBToygerFacade.bundle in Resources */,
|
||||
82B657622C91665F0079121C /* Info_sky.plist in Resources */,
|
||||
E0B3E9ED2D04B36C00907A95 /* info_xhj.plist in Resources */,
|
||||
82F1ED142BE8B9F400265D59 /* ToygerService.bundle in Resources */,
|
||||
82C026542AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist in Resources */,
|
||||
E0A496C92CA30C2C00E376BB /* xhjDevRelease.xcconfig in Resources */,
|
||||
@ -496,24 +496,24 @@
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
E0A496CB2CA30C7400E376BB /* xhjPreviewRelease.xcconfig in Resources */,
|
||||
E0B3E9EF2D04B36D00907A95 /* info_pre.plist in Resources */,
|
||||
E0A496C52CA3092500E376BB /* localDebug.xcconfig in Resources */,
|
||||
805C745A7C79091E65665B96 /* devDebug.xcconfig in Resources */,
|
||||
E0B3E9EE2D04B36C00907A95 /* info_sky.plist in Resources */,
|
||||
D415555B0C61C5422202D037 /* devProfile.xcconfig in Resources */,
|
||||
8A77CDE0EDBCACCE22C29A9E /* devRelease.xcconfig in Resources */,
|
||||
F0A7A6EF7D83CA92324D9C20 /* preDebug.xcconfig in Resources */,
|
||||
E0A496CF2CA30CEF00E376BB /* skyPreviewRelease.xcconfig in Resources */,
|
||||
04FA4A8D2CFDAE1C00A096E8 /* preXhjDebug.xcconfig in Resources */,
|
||||
9C453CBFAB0703DFA762337C /* preProfile.xcconfig in Resources */,
|
||||
44827AC367F1EAB110A97660 /* preRelease.xcconfig in Resources */,
|
||||
D7EF77645AB1C3CEEA536468 /* skyDebug.xcconfig in Resources */,
|
||||
7B54002BF45E5D8B295B6447 /* skyProfile.xcconfig in Resources */,
|
||||
25B2A1422F9A2CCCBBCBBB97 /* skyRelease.xcconfig in Resources */,
|
||||
ADF948FD9EE8BD1AE71F0984 /* xhjDebug.xcconfig in Resources */,
|
||||
E0B3E9F02D04B36D00907A95 /* info_dev.plist in Resources */,
|
||||
EE0A7A61CF36BC83ACA6EE3E /* xhjProfile.xcconfig in Resources */,
|
||||
82B657652C917F950079121C /* Info_pre.plist in Resources */,
|
||||
8B1BD17852B1F49E18DB1D6F /* xhjRelease.xcconfig in Resources */,
|
||||
E2FF5D00DFF6E2BF9DA36649 /* devLaunchScreen.storyboard in Resources */,
|
||||
04FA4A8B2CFDADFF00A096E8 /* preSKyDebug.xcconfig in Resources */,
|
||||
99FEBCD8A8244C3EE22C5A18 /* preLaunchScreen.storyboard in Resources */,
|
||||
F3C801D06AA86FB3BB32A1DA /* skyLaunchScreen.storyboard in Resources */,
|
||||
370C09E26790814FD1F6465F /* xhjLaunchScreen.storyboard in Resources */,
|
||||
@ -622,6 +622,200 @@
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
04139B652D068B83005296D1 /* Debug-pre-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = E0A496CE2CA30CEF00E376BB /* skyPreviewRelease.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "$(ASSET_PREFIX)AppIcon";
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = "Debug-pre-sky";
|
||||
};
|
||||
04139B662D068B83005296D1 /* Debug-pre-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 2DE29642D6CB826BF1547F1F /* Pods-Runner.debug-pre-sky.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-sky.entitlements";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.skychip.lock.pre.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = "Debug-pre-sky";
|
||||
};
|
||||
04139B672D068BA8005296D1 /* Debug-pre-xhj */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = E0A496CA2CA30C7400E376BB /* xhjPreviewRelease.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "$(ASSET_PREFIX)AppIcon";
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = "Debug-pre-xhj";
|
||||
};
|
||||
04139B682D068BA8005296D1 /* Debug-pre-xhj */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = A728CF82D2CACE8B399AACAB /* Pods-Runner.debug-pre-xhj.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
|
||||
INFOPLIST_FILE = Runner/info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Adhoc_com.xhjcn.lock.pre.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = "Debug-pre-xhj";
|
||||
};
|
||||
04ED96322B688AB00046472A /* Release-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 16A83D21DFB231D8453DC681 /* Pods-Runner.release-sky.xcconfig */;
|
||||
@ -630,8 +824,12 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
DEVELOPMENT_TEAM = NAQ5PL2DYC;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_sky.plist;
|
||||
INFOPLIST_FILE = Runner/info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_NAME = Runner;
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Appstore_com.skychip.lock.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
@ -649,8 +847,12 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
DEVELOPMENT_TEAM = P8997RW3V8;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
|
||||
INFOPLIST_FILE = Runner/Info_xhj.plist;
|
||||
INFOPLIST_FILE = Runner/info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock;
|
||||
PRODUCT_NAME = Runner;
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Appstore_com.xhjcn.lock.mobileprovision;
|
||||
@ -661,202 +863,6 @@
|
||||
};
|
||||
name = "Release-xhj";
|
||||
};
|
||||
04FA4A802CFDA4C100A096E8 /* Debug-pre-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 04FA4A8A2CFDADFF00A096E8 /* preSKyDebug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "$(ASSET_PREFIX)AppIcon";
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.dev;
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = "Debug-pre-sky";
|
||||
};
|
||||
04FA4A812CFDA4C100A096E8 /* Debug-pre-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 2DE29642D6CB826BF1547F1F /* Pods-Runner.debug-pre-sky.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerDebug-dev.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_dev.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Debug_com.starlock.lock.local.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = "Debug-pre-sky";
|
||||
};
|
||||
04FA4A882CFDAC5B00A096E8 /* Debug-pre-xhj */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 04FA4A8C2CFDAE1C00A096E8 /* preXhjDebug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "$(ASSET_PREFIX)AppIcon";
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.dev;
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = "Debug-pre-xhj";
|
||||
};
|
||||
04FA4A892CFDAC5B00A096E8 /* Debug-pre-xhj */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = A728CF82D2CACE8B399AACAB /* Pods-Runner.debug-pre-xhj.xcconfig */;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerDebug-dev.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_dev.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = Debug_com.starlock.lock.local.mobileprovision;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = "Debug-pre-xhj";
|
||||
};
|
||||
5028C464A6FD115380ECE6A0 /* Release-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 35F02D170492750B437D6AB6 /* skyRelease.xcconfig */;
|
||||
@ -891,6 +897,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
@ -906,7 +913,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_FILE = Runner/info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@ -919,7 +926,7 @@
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
@ -961,6 +968,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
@ -976,7 +984,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_FILE = Runner/info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@ -989,7 +997,7 @@
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
@ -1031,6 +1039,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
@ -1066,6 +1075,7 @@
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.dev;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
@ -1082,8 +1092,12 @@
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_dev.plist;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.starlock.lock.local;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -1095,7 +1109,7 @@
|
||||
};
|
||||
name = "Debug-local";
|
||||
};
|
||||
E0A496D02CA30D2800E376BB /* pre-release-sky */ = {
|
||||
E0A496D02CA30D2800E376BB /* Pre-release-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = E0A496CE2CA30CEF00E376BB /* skyPreviewRelease.xcconfig */;
|
||||
buildSettings = {
|
||||
@ -1129,6 +1143,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
@ -1144,7 +1159,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_FILE = Runner/info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@ -1155,17 +1170,17 @@
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = "pre-release-sky";
|
||||
name = "Pre-release-sky";
|
||||
};
|
||||
E0A496D12CA30D2800E376BB /* pre-release-sky */ = {
|
||||
E0A496D12CA30D2800E376BB /* Pre-release-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = D697F91E8405773AB9A5881E /* Pods-Runner.pre-release-sky.xcconfig */;
|
||||
buildSettings = {
|
||||
@ -1174,8 +1189,12 @@
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_pre.plist;
|
||||
INFOPLIST_FILE = Runner/info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.pre;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -1185,9 +1204,9 @@
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = "pre-release-sky";
|
||||
name = "Pre-release-sky";
|
||||
};
|
||||
E0A496D22CA30D5A00E376BB /* dev-release-sky */ = {
|
||||
E0A496D22CA30D5A00E376BB /* Dev-release-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = E0A496CC2CA30CA900E376BB /* skyDevRelease.xcconfig */;
|
||||
buildSettings = {
|
||||
@ -1221,6 +1240,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
@ -1236,7 +1256,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_FILE = Runner/info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@ -1249,15 +1269,15 @@
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = "dev-release-sky";
|
||||
name = "Dev-release-sky";
|
||||
};
|
||||
E0A496D32CA30D5A00E376BB /* dev-release-sky */ = {
|
||||
E0A496D32CA30D5A00E376BB /* Dev-release-sky */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 126D1370182AB44291C67A10 /* Pods-Runner.dev-release-sky.xcconfig */;
|
||||
buildSettings = {
|
||||
@ -1266,8 +1286,12 @@
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = NAQ5PL2DYC;
|
||||
INFOPLIST_FILE = Runner/Info_dev.plist;
|
||||
INFOPLIST_FILE = Runner/info_sky.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.skychip.lock.dev;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -1277,9 +1301,9 @@
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = "dev-release-sky";
|
||||
name = "Dev-release-sky";
|
||||
};
|
||||
E0A496D42CA30D7400E376BB /* pre-release-xhj */ = {
|
||||
E0A496D42CA30D7400E376BB /* Pre-release-xhj */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = E0A496CA2CA30C7400E376BB /* xhjPreviewRelease.xcconfig */;
|
||||
buildSettings = {
|
||||
@ -1313,6 +1337,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
@ -1328,7 +1353,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_FILE = Runner/info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@ -1339,17 +1364,17 @@
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = "pre-release-xhj";
|
||||
name = "Pre-release-xhj";
|
||||
};
|
||||
E0A496D52CA30D7400E376BB /* pre-release-xhj */ = {
|
||||
E0A496D52CA30D7400E376BB /* Pre-release-xhj */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 789004F1B475B44713E199BC /* Pods-Runner.pre-release-xhj.xcconfig */;
|
||||
buildSettings = {
|
||||
@ -1358,8 +1383,12 @@
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
|
||||
INFOPLIST_FILE = Runner/Info_pre.plist;
|
||||
INFOPLIST_FILE = Runner/info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.pre;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -1369,9 +1398,9 @@
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = "pre-release-xhj";
|
||||
name = "Pre-release-xhj";
|
||||
};
|
||||
E0A496D62CA30D8400E376BB /* dev-release-xhj */ = {
|
||||
E0A496D62CA30D8400E376BB /* Dev-release-xhj */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = E0A496C82CA30C2C00E376BB /* xhjDevRelease.xcconfig */;
|
||||
buildSettings = {
|
||||
@ -1405,6 +1434,7 @@
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
EXCLUDED_ARCHS = "";
|
||||
@ -1420,7 +1450,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_FILE = Runner/info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@ -1433,15 +1463,15 @@
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = "dev-release-xhj";
|
||||
name = "Dev-release-xhj";
|
||||
};
|
||||
E0A496D72CA30D8400E376BB /* dev-release-xhj */ = {
|
||||
E0A496D72CA30D8400E376BB /* Dev-release-xhj */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = ED3A443EA1439FD0FB4BCF80 /* Pods-Runner.dev-release-xhj.xcconfig */;
|
||||
buildSettings = {
|
||||
@ -1450,8 +1480,12 @@
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = P8997RW3V8;
|
||||
INFOPLIST_FILE = Runner/Info_dev.plist;
|
||||
INFOPLIST_FILE = Runner/info_xhj.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
/usr/lib/swift,
|
||||
"$(inherited)",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.xhjcn.lock.dev;
|
||||
PRODUCT_NAME = Runner;
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
@ -1461,7 +1495,7 @@
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = "dev-release-xhj";
|
||||
name = "Dev-release-xhj";
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
@ -1470,14 +1504,14 @@
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
E0A496C62CA309AD00E376BB /* Debug-local */,
|
||||
04FA4A802CFDA4C100A096E8 /* Debug-pre-sky */,
|
||||
04FA4A882CFDAC5B00A096E8 /* Debug-pre-xhj */,
|
||||
5028C464A6FD115380ECE6A0 /* Release-sky */,
|
||||
E0A496D02CA30D2800E376BB /* pre-release-sky */,
|
||||
E0A496D22CA30D5A00E376BB /* dev-release-sky */,
|
||||
E0A496D02CA30D2800E376BB /* Pre-release-sky */,
|
||||
04139B652D068B83005296D1 /* Debug-pre-sky */,
|
||||
E0A496D22CA30D5A00E376BB /* Dev-release-sky */,
|
||||
9073AF548DAA546CE84A8D2F /* Release-xhj */,
|
||||
E0A496D42CA30D7400E376BB /* pre-release-xhj */,
|
||||
E0A496D62CA30D8400E376BB /* dev-release-xhj */,
|
||||
E0A496D42CA30D7400E376BB /* Pre-release-xhj */,
|
||||
04139B672D068BA8005296D1 /* Debug-pre-xhj */,
|
||||
E0A496D62CA30D8400E376BB /* Dev-release-xhj */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = "Debug-local";
|
||||
@ -1486,14 +1520,14 @@
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
E0A496C72CA309AD00E376BB /* Debug-local */,
|
||||
04FA4A812CFDA4C100A096E8 /* Debug-pre-sky */,
|
||||
04FA4A892CFDAC5B00A096E8 /* Debug-pre-xhj */,
|
||||
04ED96322B688AB00046472A /* Release-sky */,
|
||||
E0A496D12CA30D2800E376BB /* pre-release-sky */,
|
||||
E0A496D32CA30D5A00E376BB /* dev-release-sky */,
|
||||
E0A496D12CA30D2800E376BB /* Pre-release-sky */,
|
||||
04139B662D068B83005296D1 /* Debug-pre-sky */,
|
||||
E0A496D32CA30D5A00E376BB /* Dev-release-sky */,
|
||||
04ED96352B688AB00046472A /* Release-xhj */,
|
||||
E0A496D52CA30D7400E376BB /* pre-release-xhj */,
|
||||
E0A496D72CA30D8400E376BB /* dev-release-xhj */,
|
||||
E0A496D52CA30D7400E376BB /* Pre-release-xhj */,
|
||||
04139B682D068BA8005296D1 /* Debug-pre-xhj */,
|
||||
E0A496D72CA30D8400E376BB /* Dev-release-xhj */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = "Debug-local";
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1500"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Release-dev"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug-pre-sky"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release-dev"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Release-dev">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release-dev"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@ -1,71 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1500"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Release-dev"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug-pre-xhj"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release-dev"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Release-dev">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release-dev"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@ -1,71 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1500"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Release-dev"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug-local"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release-dev"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Release-dev">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release-dev"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@ -24,7 +24,7 @@
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Release-sky"
|
||||
buildConfiguration = "Debug-pre-xhj"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Release-xhj"
|
||||
buildConfiguration = "Debug-pre-xhj"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict/>
|
||||
</plist>
|
||||
@ -5,7 +5,7 @@
|
||||
#import "XSFlutterManager.h"
|
||||
|
||||
#import <UserNotifications/UserNotifications.h>
|
||||
|
||||
#import <UMCommon/UMCommon.h>
|
||||
|
||||
|
||||
@interface AppDelegate()
|
||||
@ -19,6 +19,8 @@
|
||||
- (BOOL)application:(UIApplication *)application
|
||||
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||
|
||||
[UMConfigure initWithAppkey:@"671244ae80464b33f6df9646" channel:@"Product"];
|
||||
|
||||
XSFlutterManager *VC = [[XSFlutterManager alloc] init];
|
||||
self.window.rootViewController = VC;
|
||||
[self.window makeKeyAndVisible];
|
||||
|
||||
131
ios/Runner/Info.plist
Normal file
131
ios/Runner/Info.plist
Normal file
@ -0,0 +1,131 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>$(BUNDLE_DISPLAY_NAME)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(BUNDLE_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>None</string>
|
||||
<key>CFBundleURLIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.sky.skysmartlock</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>skysmartlock</string>
|
||||
<string></string>
|
||||
<string></string>
|
||||
</array>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Editor</string>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>weixin</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>wxbe340095d2b8fd51</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
<array>
|
||||
<string>weixin</string>
|
||||
<string>weixinULAPI</string>
|
||||
<string>weixinURLParamsAPI</string>
|
||||
</array>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
<true/>
|
||||
<key>NSAllowsArbitraryLoadsInWebContent</key>
|
||||
<true/>
|
||||
<key>NSExceptionDomains</key>
|
||||
<dict>
|
||||
<key>jpush.cn</key>
|
||||
<dict>
|
||||
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
||||
<true/>
|
||||
<key>NSIncludesSubdomains</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>NSBluetoothAlwaysUsageDescription</key>
|
||||
<string>The app uses bluetooth to find, connect and transfer data between different devices</string>
|
||||
<key>NSBluetoothPeripheralUsageDescription</key>
|
||||
<string>The app uses bluetooth to find, connect and transfer data between different devices</string>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>应用请求相机,以便于拍摄照片,用于头像上传及人脸认证</string>
|
||||
<key>NSContactsUsageDescription</key>
|
||||
<string>Reason we need access to the contact list</string>
|
||||
<key>NSFileProtectionKey</key>
|
||||
<string>NSFileProtectionCompleteUntilFirstUserAuthentication</string>
|
||||
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
|
||||
<string>应用在前台和后台的时候可以搜到更新的位置信息</string>
|
||||
<key>NSLocationAlwaysUsageDescription</key>
|
||||
<string>应用在后台的时候可以搜到更新的位置信息</string>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>应用在前台的时候可以搜到更新的位置信息</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>应用请求麦克风用来通话</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>应用请求相册用于头像上传</string>
|
||||
<key>UIApplicationSceneManifest</key>
|
||||
<dict>
|
||||
<key>UISceneConfigurations</key>
|
||||
<dict/>
|
||||
</dict>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>remote-notification</string>
|
||||
</array>
|
||||
<key>UIFileSharingEnabled</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>skyLaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
</array>
|
||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>io.flutter.embedded_views_preview</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@ -7,7 +7,7 @@
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<string>$(BUNDLE_DISPLAY_NAME)</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
@ -15,7 +15,7 @@
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<string>$(BUNDLE_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
@ -21,11 +21,11 @@ elif [[ $ENV_BUILD_TAG =~ $regex ]]; then
|
||||
bundle exec fastlane release flavor:sky --verbose
|
||||
elif [[ "${ENV_BUILD_BRANCH}" == "develop" ]]; then
|
||||
echo "===build dev===${NEXT_VERSION}"
|
||||
bundle exec fastlane beta flavor:xhj env:dev --verbose
|
||||
bundle exec fastlane beta flavor:sky env:dev --verbose
|
||||
bundle exec fastlane beta flavor:xhj env:Dev --verbose
|
||||
bundle exec fastlane beta flavor:sky env:Dev --verbose
|
||||
elif [[ "${ENV_BUILD_BRANCH}" == "release" ]] || [[ "${ENV_BUILD_BRANCH}" == "feat_devops" ]] ; then
|
||||
echo "===build pre===${NEXT_VERSION}"
|
||||
bundle exec fastlane beta flavor:xhj env:pre --verbose
|
||||
bundle exec fastlane beta flavor:sky env:pre --verbose
|
||||
bundle exec fastlane beta flavor:xhj env:Pre --verbose
|
||||
bundle exec fastlane beta flavor:sky env:Pre --verbose
|
||||
fi
|
||||
exit 0
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "بعد إعادة الضبط ، سيتم حذف الأوردة المشطية للقفل. هل أنت متأكد أنك تريد إعادة الضبط ؟",
|
||||
"在线": "الإنترنت",
|
||||
"离线": "غير متصل"
|
||||
"离线": "غير متصل",
|
||||
"购买记录": "سجل الشراء",
|
||||
"使用记录": "سجل المستخدم",
|
||||
"失效时间要大于当前时间": "يجب أن يكون وقت انتهاء الصلاحية أطول من الوقت الحالي",
|
||||
"修改名字": "تعديل الاسم",
|
||||
"时": "ساعة",
|
||||
"分": "دقيقة",
|
||||
"Amazon Alexa": "أمازون اليكما",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "يمكنك استخدام اليكرا لفتح ، قفل والتحقق من حالة القفل",
|
||||
"支持的国家": "البلدان المدعومة",
|
||||
"支持的国家值": "الولايات المتحدة الأمريكية, كندا, المملكة المتحدة, أستراليا, الهند, ألمانيا, فرنسا, إيطاليا, إسبانيا, اليابان",
|
||||
"操作流程": "عملية التشغيل",
|
||||
"操作流程值": "1 إضافة قفل وبوابة مع تطبيق القفل الذكي\n\n2 تمكين وظيفة فتح القفل عن بعد للقفل في التطبيق (يتم إيقاف تشغيل هذه الوظيفة افتراضيًا). إذا لم يكن لديك هذا الخيار ، فإن القفل لا يدعم اليكسا\n\n3 أضف مهارات إلى اليكسز وقم بتخويلها باستخدام حساب تطبيق القفل الذكي وكلمة المرور. بعد نجاح التفويض ، يمكنك اكتشاف أجهزة ضمن الحساب\n\n4 حدد موقع القفل في تطبيق اليكسا ، وقم بتشغيل وظيفة إلغاء القفل الصوتي ، وقم بتعيين كلمة مرور اللغة\n\n5 يمكن تشغيل القفل من خلال اليكزا",
|
||||
"Google Home": "منزل جوجل",
|
||||
"Action name": "اسم العمل",
|
||||
"ScienerSmart": "سنيرذكي",
|
||||
"支持的语言": "اللغات المدعومة",
|
||||
"英语": "الانجليزية",
|
||||
"Google Home操作流程的值": "1. استخدم تطبيق القفل الذكي لإضافة أقفال وبوابات\n\n2. تمكين وظيفة فتح القفل عن بعد للقفل في التطبيق (يتم إيقاف تشغيل هذه الوظيفة افتراضيًا). بدون هذا الخيار ، لا يدعم القفل منزل جوجل\n\n3. قم بتثبيت تطبيق Google المنزلي وانقر على زر \"\" في الزاوية العلوية اليسرى\n\n4. في صفحة الإعدادات ، حدد \"العمل مع Google\"\n\n5. البحث عن \"scienerذكي\" واستخدام حساب تطبيق القفل الذكي وكلمة المرور للتفويض",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "يجب أن تحتوي كلمة المرور على الأقل على 2 مما يلي: الأرقام والحروف والأحرف الخاصة",
|
||||
"已开锁": "غير مقفل",
|
||||
"已闭锁": "مقفل",
|
||||
"两次密码不一致哦": "كلمات المرور غير متسقة"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "След нулиране, метакарпалните вени на ключалката ще бъдат изтрити. Сигурен ли сте, че искате да се възстанови?",
|
||||
"在线": "Онлайн",
|
||||
"离线": "Офлайн"
|
||||
"离线": "Офлайн",
|
||||
"购买记录": "Запис за покупка",
|
||||
"使用记录": "Потребителски запис",
|
||||
"失效时间要大于当前时间": "Срокът на изтичане трябва да бъде по-дълъг от текущото време",
|
||||
"修改名字": "Редактиране на името",
|
||||
"时": "Час",
|
||||
"分": "Минута",
|
||||
"Amazon Alexa": "Амазонка алекса",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Можете да използвате alexa за отключване, заключване и проверка на състоянието на заключване",
|
||||
"支持的国家": "Подкрепени страни",
|
||||
"支持的国家值": "Сащ, канада, великобритания, австралия, индия, германия, франция, италия, испания, япония",
|
||||
"操作流程": "Процес на операция",
|
||||
"操作流程值": "1 добавете заключване и шлюз с приложението smart lock\n\n2 активирайте дистанционното отключване на функцията за заключване в приложението (тази функция е изключена по подразбиране). Ако не разполагате с тази опция, заключването не поддържа alexa\n\n3 добавете умения към alexa и ги разрешавайте с акаунта и паролата на приложението smart lock. След като разрешението е успешно, можете да откриете устройства под акаунта\n\n4 намерете заключването в приложението alexa, включете функцията за отключване на гласа и задайте паролата за езика\n\n5 ключалката може да се управлява чрез alexa",
|
||||
"Google Home": "Google home",
|
||||
"Action name": "Име на действие",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Поддържани езици",
|
||||
"英语": "Английски",
|
||||
"Google Home操作流程的值": "1. използвайте приложението smart lock, за да добавите брави и шлюзове\n\n2. активирайте дистанционното отключване на функцията за заключване в приложението (тази функция е изключена по подразбиране). Без тази опция, заключването не поддържа google home\n\n3. инсталирайте приложението google home и кликнете върху бутона \"\" в горния ляв ъгъл\n\n4. на страницата с настройките изберете \"работа с google\"\n\n5. търсете \"scienersmart\" и използвайте акаунта и паролата на app smart lock, за да разрешите",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Паролата трябва да съдържа поне 2 от следните: числа, букви и специални символи",
|
||||
"已开锁": "Отключена",
|
||||
"已闭锁": "Заключен",
|
||||
"两次密码不一致哦": "Паролите са непоследователни"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "ব্যান্ডোটারআইসেট, হাসিপাল রিরিইনস্ফথেলকবইল্ডজেডড।?",
|
||||
"在线": "কনলাইন",
|
||||
"离线": "দেউন্টলাইনCity in Ontario Canada"
|
||||
"离线": "দেউন্টলাইনCity in Ontario Canada",
|
||||
"购买记录": "পুরস্কার্ড",
|
||||
"使用记录": "ব্যবহারকারীর কর্তৃক",
|
||||
"失效时间要大于当前时间": "দীর্ঘকালীন",
|
||||
"修改名字": "নেম",
|
||||
"时": "Hour",
|
||||
"分": "নিউট",
|
||||
"Amazon Alexa": "Ammogonalexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "/অনুপন্থির",
|
||||
"支持的国家": "আদিবাস্য",
|
||||
"支持的国家值": "ইউসা, চা, uk, ঊর্ধ্ব, ডাইডিয়া, germany, ডিফায়েন্স, লি, ইম্পোসি, ইজেড",
|
||||
"操作流程": "ক্যামেশনprocesscess",
|
||||
"操作流程值": "1 বিরোধীদ্যালক্যান্ডgatkorethrouthhescartchlockParp\n\n2 দশমিক... ...সম্পোকলকিং... লকটিংয়ের (সংখ্যা ইংলিপিস অফবি-রফ-এফল্ট)। ফিফডোনট্যানস্ট্রিওপশন, থেলক ক্যান্টোনট\n\n3 বিদ্রোহী স্কুই ls টু-এক্সাআন্ড ঊর্ধ্বতন পোস্টার্থে\n\n৪লক্যাটথলকের দিন ইক্সাপপ্প, টেসিতে ইসোলাকক fun\n\n5thelockcanbe equavaedunderroughalexaxa",
|
||||
"Google Home": "শ্রোগল",
|
||||
"Action name": "কর্মসূচী",
|
||||
"ScienerSmart": "ইসিসিভার্ট",
|
||||
"支持的语言": "আদিবাস্য",
|
||||
"英语": "সেনডেনলিশ",
|
||||
"Google Home操作流程的值": "1. .এইচস্টার্টলকপ্পটো অ্যাক্টোক্যাকস্যান্ড ডিগ্রি\n\n2. দ্বিধাবিহীন হাউটস্টার্ডিউপিসোভিশন, thelock CantonesnotlendipportoogleAnhome\n\n3 .এনস্টলথে\n\n৪..অনুপিজিংসপেজ, \"কর্মবৃন্দে\" নির্বাচন করুন\"\n\n৫..পেরার্ফোর \"সাইকিয়ারস্কার্টার্ট\" এবং ব্যবহারকারী ছর্টলাকপ্প-এরকন্টন্ড pas-স্কওয়ার্ডটু",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "ইসওয়ার্ডমস্টস্টেটলিয়াস্ট 2ofthefক্লোভিং:",
|
||||
"已开锁": "কনুকলচকেড",
|
||||
"已闭锁": "লোকচকেড",
|
||||
"两次密码不一致哦": "Thepasswordsare pencay"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetování budou metakarpální žíly zámku odstraněny. Jste si jistý, že chcete resetovat?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Zápis nákupu",
|
||||
"使用记录": "Záznam uživatele",
|
||||
"失效时间要大于当前时间": "Doba platnosti musí být delší než současný čas",
|
||||
"修改名字": "Upravit název",
|
||||
"时": "Hodina",
|
||||
"分": "Minuta",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Můžete použít alexa na odemčení, zamčení a kontrolu stavu zámku",
|
||||
"支持的国家": "Podporované země",
|
||||
"支持的国家值": "Usa, kanada, velká británie, austrálie, indie, německo, francie, itálie, španělsko, japonsko",
|
||||
"操作流程": "Proces operace",
|
||||
"操作流程值": "1 přidat zámek a bránu s aplikací smart lock\n\n2 zapněte funkci vzdáleného odblokování zámku v aplikaci (tato funkce je ve výchozím nastavení vypnuta). Pokud nemáte tuto možnost, zámek nepodporuje alexa.\n\n3 přidat dovednosti k alexa a povolit je pomocí účtu a hesla aplikace smart lock. Poté, co je oprávnění úspěšné, můžete objevit zařízení v rámci účtu\n\n4 vyhledejte zámek v aplikaci alexa, zapněte funkci odemčení hlasu a nastavte heslo jazyka\n\n5 zámek lze ovládat prostřednictvím alexa",
|
||||
"Google Home": "Google home",
|
||||
"Action name": "Název akce",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Podporované jazyky",
|
||||
"英语": "English",
|
||||
"Google Home操作流程的值": "1. použijte aplikaci smart lock pro přidání zámků a brán\n\n2. enable the remote unlocking function of the lock in the app (this function is off by default). Bez této možnosti nepodporuje zámek google home\n\n3. nainstalujte aplikaci google home a klepněte na tlačítko \"\" v levé horní části\n\n4. na stránce nastavení vyberte \"práce s google\"\n\n5. search for \"scienersmart\" and use the smart lock app account and password to authorize",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Heslo musí obsahovat alespoň 2 z těchto údajů: čísla, písmena a zvláštní znaky",
|
||||
"已开锁": "Odemčeno",
|
||||
"已闭锁": "Zamčeno",
|
||||
"两次密码不一致哦": "Hesla jsou nekonzistentní"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter nulstilling, de metacarpal vener i låsen vil blive slettet. Er du sikker på at du vil nulstille?",
|
||||
"在线": "OnlineComment",
|
||||
"离线": "OfflineComment"
|
||||
"离线": "OfflineComment",
|
||||
"购买记录": "Købsregistre",
|
||||
"使用记录": "Brugerrekord",
|
||||
"失效时间要大于当前时间": "Udløbstiden skal være længere end nuværende tidspunkt.",
|
||||
"修改名字": "Redigér navn",
|
||||
"时": "Time",
|
||||
"分": "Minutt",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Du kan bruge Alexa til at låse op, låse og kontrollere låsen status.",
|
||||
"支持的国家": "Støttede lande",
|
||||
"支持的国家值": "USA, Canada, Storbritannien, Australien, Indien, Tyskland, Frankrig, Italien, Spanien, Japan.",
|
||||
"操作流程": "Driftsprocesser",
|
||||
"操作流程值": "1 Tilføj en lås og gateway med Smart lås APP\n\n2 Aktiver den fjernlåsefunktion af låsen i APP (denne funktion er slukket som standard). Hvis du ikke har denne indstilling, understøtter låsen ikke Alexa\n\n3 Tilføj færdigheder til Alexa og autorisere dem med Smart lås APP konto og adgangskode. Når godkendelsen er vellykket, kan du opdage enheder under kontoen\n\n4 Find låsen i Alexa-appen, tænd stemme oplåsfunktionen og indstille adgangskoden for sproget.\n\n5 Låsen kan betjenes gennem Alexa",
|
||||
"Google Home": "Google-hjemName",
|
||||
"Action name": "Handlingsnavn",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Understøttede sprog",
|
||||
"英语": "Engelsk",
|
||||
"Google Home操作流程的值": "1. Brug Smart lås APP til at tilføje låse og gateways\n\n2. Aktiver den fjernlåsefunktion af låsen i APP (denne funktion er slukket som standard). Uden denne indstilling understøtter låsen ikke Google Home.\n\n3. Installer Google Home APP og klik på \" \" knappen i øverste venstre hjørne\n\n4. På siden Indstillinger skal du vælge \"Arbejd med Google\"\n\n5. Søg efter \"ScienerSmart\" og brug den smart lås APP-konto og adgangskode til at autorisere",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Adgangskoden skal indeholde mindst 2 af følgende: tal, bogstaver og særlige tegn",
|
||||
"已开锁": "Ulåset",
|
||||
"已闭锁": "Låset",
|
||||
"两次密码不一致哦": "Adgangskoderne er inkonsekvente"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nach dem Zurücksetzen werden die Mittelhand adern des Schlosses gelöscht. Sind Sie sicher, dass Sie zurücksetzen wollen?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Kauf rekord",
|
||||
"使用记录": "Benutzer aufzeichnung",
|
||||
"失效时间要大于当前时间": "Die Ablauf zeit muss länger sein als die aktuelle Zeit",
|
||||
"修改名字": "Name bearbeiten",
|
||||
"时": "Stunde",
|
||||
"分": "Minute",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Sie können Alexa verwenden, um den Sperr status zu entsperren, zu sperren und zu überprüfen",
|
||||
"支持的国家": "Unterstützte Länder",
|
||||
"支持的国家值": "USA, Kanada, Großbritannien, Australien, Indien, Deutschland, Frankreich, Italien, Spanien, Japan",
|
||||
"操作流程": "Betriebs prozess",
|
||||
"操作流程值": "1 Fügen Sie ein Schloss und ein Gateway mit der Smart Lock APP hinzu\n\n2 Aktivieren Sie die Remote-Entriegelung funktion der Sperre in der APP (diese Funktion ist standard mäßig deaktiviert). Wenn Sie diese Option nicht haben, unterstützt die Sperre Alexa nicht\n\n3 Fügen Sie Alexa Fähigkeiten hinzu und autorisieren Sie sie mit dem Konto und Passwort der Smart Lock APP. Nachdem die Autor isierung erfolgreich ist, können Sie Geräte unter dem Konto entdecken\n\n4 Suchen Sie die Sperre in der Alexa-App, schalten Sie die Funktion zum Ent sperren der Stimme ein und legen Sie das Sprach kennwort fest\n\n5 Das Schloss kann durch Alexa betrieben werden",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Name der Aktion",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Unterstützte Sprachen",
|
||||
"英语": "Englisch",
|
||||
"Google Home操作流程的值": "1. Verwenden Sie die Smart Lock APP, um Schlösser und Gateways hinzuzufügen\n\n2. Aktivieren Sie die Remote-Entriegelung funktion der Sperre in der APP (diese Funktion ist standard mäßig deaktiviert). Ohne diese Option unterstützt die Sperre Google Home nicht\n\n3. Installieren Sie die Google Home APP und klicken Sie auf die Schaltfläche \"\" in der oberen linken Ecke\n\n4. Wählen Sie auf der Seite Einstellungen \"Mit Google arbeiten\"\n\n5. Suchen Sie nach \"ScienerS mart\" und verwenden Sie das Smart Lock APP-Konto und das Passwort, um es zu autorisieren",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Das Passwort muss mindestens 2 der folgenden Zahlen enthalten: Zahlen, Buchstaben und Sonder zeichen",
|
||||
"已开锁": "Entsperrt",
|
||||
"已闭锁": "Gesperrt",
|
||||
"两次密码不一致哦": "Die Passwörter sind inkonsistent"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Μετά την επαναφορά, οι μετακάρπιες φλέβες της κλειδαριάς θα διαγραφούν. Είστε σίγουροι ότι θέλετε να επαναφέρετε;",
|
||||
"在线": "Σε απευθείας σύνδεση",
|
||||
"离线": "Εκτός σύνδεσης:"
|
||||
"离线": "Εκτός σύνδεσης:",
|
||||
"购买记录": "Αρχείο αγοράς",
|
||||
"使用记录": "Καταγραφή χρήστη",
|
||||
"失效时间要大于当前时间": "Ο χρόνος λήξης πρέπει να είναι μεγαλύτερος από την τρέχουσα ώρα.",
|
||||
"修改名字": "Επεξεργασία όνομας",
|
||||
"时": "Ώρα",
|
||||
"分": "Λεπτό",
|
||||
"Amazon Alexa": "Αμαζόνιο Αλέξα",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Μπορείτε να χρησιμοποιήσετε Alexa για να ξεκλειδώσετε, να κλειδώσετε και να ελέγξετε την κατάσταση κλειδαριάς",
|
||||
"支持的国家": "Υποστηριζόμενες χώρες",
|
||||
"支持的国家值": "ΗΠΑ, Καναδάς, Ηνωμένο Βασίλειο, Αυστραλία, Ινδία, Γερμανία, Γαλλία, Ιταλία, Ισπανία, Ιαπωνία",
|
||||
"操作流程": "Διαδικασία λειτουργίας",
|
||||
"操作流程值": "1 Προσθέστε μια κλειδαριά και πύλη με την Smart κλειδαριά APP\n\n2 Ενεργοποιήστε τη λειτουργία απομακρυσμένου ξεκλειδώματος της κλειδαριάς στο APP (αυτή η συνάρτηση είναι απενεργοποιημένη από προεπιλογή). Αν δεν έχετε αυτή την επιλογή, η κλειδαριά δεν υποστηρίζει Alexa\n\n3 Προσθέστε τις δεξιότητες στην Alexa και να τις εξουσιοδοτήσετε με το λογαριασμό και τον κωδικό πρόσβασης Smart. Μετά την επιτυχία της εξουσιοδότησης, μπορείτε να ανακαλύψετε συσκευές κάτω από τον λογαριασμό\n\n4 Εντοπίστε την κλειδαριά στην εφαρμογή Alexa, ενεργοποιήστε τη λειτουργία φωνής ξεκλειδώματος, και να ορίσετε τον κωδικό πρόσβασης γλώσσας\n\n5 Η κλειδαριά μπορεί να λειτουργήσει μέσω Alexa",
|
||||
"Google Home": "Σπίτι του GoogleName",
|
||||
"Action name": "Όνομα ενέργειας",
|
||||
"ScienerSmart": "ΕπιστήμοναςSmart",
|
||||
"支持的语言": "Υποστηριζόμενες γλώσσες",
|
||||
"英语": "Αγγλική",
|
||||
"Google Home操作流程的值": "1. Χρησιμοποιήστε το Smart Lock APP για να προσθέσετε κλειδαριές και πύλες\n\n2. Ενεργοποιήστε τη λειτουργία απομακρυσμένου ξεκλειδώματος της κλειδαριάς στο APP (αυτή η λειτουργία είναι απενεργοποιημένη από προεπιλογή). Χωρίς αυτή την επιλογή, η κλειδαριά δεν υποστηρίζει το Google HomeName\n\n3. Εγκαταστήστε το Google Home APP και κάντε κλικ στο \" \" πλήκτρο στην επάνω αριστερή γωνία\n\n4. Στη σελίδα Ρυθμίσεις, επιλέξτε \"Εργασία με Google\"\n\n5. Αναζητήστε το \"ScienerSmart\" και να χρησιμοποιήσετε τον έξυπνο λογαριασμό και τον κωδικό πρόσβασης για να εξουσιοδοτήσει",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 2 από τα ακόλουθα: αριθμούς, γράμματα και ειδικούς χαρακτήρες.",
|
||||
"已开锁": "Ξεκλείδωμα",
|
||||
"已闭锁": "Κλειδωμένο",
|
||||
"两次密码不一致哦": "Οι κωδικοί πρόσβασης δεν είναι συνεπείς."
|
||||
}
|
||||
@ -1087,7 +1087,27 @@
|
||||
"离线": "Offline",
|
||||
"购买记录": "Purchase record",
|
||||
"使用记录": "User Record",
|
||||
|
||||
"失效时间要大于当前时间": "The expiration time must be longer than the current time",
|
||||
"修改名字": "Edit name"
|
||||
"修改名字": "Edit name",
|
||||
"时": "hour",
|
||||
"分": "minute",
|
||||
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "You can use Alexa to unlock, lock and check the lock status",
|
||||
"支持的国家": "Supported countries",
|
||||
"支持的国家值": "USA, Canada, UK, Australia, India, Germany, France, Italy, Spain, Japan",
|
||||
"操作流程": "Operation process",
|
||||
"操作流程值":"1 Add a lock and gateway with the Smart lock APP \n\n2 Enable the remote unlocking function of the lock in the APP (this function is turned off by default). If you do not have this option, the lock does not support Alexa \n\n3 Add skills to Alexa and authorize them with the Smart lock APP's account and password. After the authorization is successful, you can discover devices under the account \n\n4 Locate the lock in the Alexa app, turn on the voice unlock function, and set the language password \n\n5 The lock can be operated through Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Action name",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Supported languages",
|
||||
"英语": "English",
|
||||
"Google Home操作流程的值": "1. Use the Smart lock APP to add locks and gateways \n\n2. Enable the remote unlocking function of the lock in the APP (this function is turned off by default). Without this option, the lock does not support Google Home \n\n3. Install the Google Home APP and click the \"+\" button in the top left corner \n\n4. On the Settings page, select \"Work with Google\" \n\n5. Search for \"ScienerSmart\" and use the smart lock APP account and password to authorize",
|
||||
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "The password must contain at least 2 of the following: numbers, letters, and special characters",
|
||||
"已开锁": "Unlocked",
|
||||
"已闭锁": "Locked",
|
||||
"两次密码不一致哦": "The passwords are inconsistent"
|
||||
|
||||
}
|
||||
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Después del reinicio, se eliminarán las venas metacarpiales de la cerradura. ¿Está seguro de que desea restablecer?",
|
||||
"在线": "En línea",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Registro de compra",
|
||||
"使用记录": "Registro de usuario",
|
||||
"失效时间要大于当前时间": "El tiempo de expiración debe ser más largo que el tiempo actual",
|
||||
"修改名字": "Editar nombre",
|
||||
"时": "Hora",
|
||||
"分": "Minuto",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Puede usar Alexa para desbloquear, bloquear y verificar el estado del bloqueo",
|
||||
"支持的国家": "Países apoyados",
|
||||
"支持的国家值": "Estados Unidos, Canadá, Reino Unido, Australia, India, Alemania, Francia, Italia, España, Japón",
|
||||
"操作流程": "Proceso de operación",
|
||||
"操作流程值": "1 Añadir una cerradura y puerta de enlace con la aplicación de bloqueo inteligente\n\n2 Habilite la función de desbloqueo remoto de la cerradura en la APP (esta función está desactivada por defecto). Si no tiene esta opción, el bloqueo no es compatible con Alexa\n\n3 Agregue habilidades a Alexa y autorícelas con la cuenta y contraseña de la aplicación de bloqueo inteligente. Después de que la autorización sea exitosa, puede descubrir dispositivos bajo la cuenta\n\n4 Localice el bloqueo en la aplicación Alexa, encienda la función de desbloqueo de voz y configure la contraseña del idioma\n\n5 La cerradura puede ser operada a través de Alexa",
|
||||
"Google Home": "Inicio de Google",
|
||||
"Action name": "Nombre de acción",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Idiomas soportados",
|
||||
"英语": "Inglés",
|
||||
"Google Home操作流程的值": "1. use la aplicación de bloqueo inteligente para agregar cerraduras y pasarelas\n\n2. habilitar la función de desbloqueo remoto de la cerradura en la aplicación (esta función está desactivada por defecto). Sin esta opción, el bloqueo no es compatible con Google Home\n\n3. instale la aplicación Google Home y haga clic en el botón \"\" en la esquina superior izquierda\n\n4. En la página Configuración, seleccione \"Trabajar con Google\"\n\n5. busque \"ScienerSmart\" y use la cuenta y la contraseña de la aplicación de bloqueo inteligente para autorizar",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "La contraseña debe contener al menos 2 de los siguientes: números, letras y caracteres especiales",
|
||||
"已开锁": "Desbloqueado",
|
||||
"已闭锁": "Bloqueado",
|
||||
"两次密码不一致哦": "Las contraseñas son inconsistentes"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Pärast lähtestamist kustutatakse luku metakarpaalveenid. Kas tõesti soovid lähtestada?",
|
||||
"在线": "Võrgus",
|
||||
"离线": "Mitte ühendust"
|
||||
"离线": "Mitte ühendust",
|
||||
"购买记录": "Ostu kirjed",
|
||||
"使用记录": "Kasutaja kirje",
|
||||
"失效时间要大于当前时间": "Kehtivusaeg peab olema pikem kui praegune aeg",
|
||||
"修改名字": "Muuda nime",
|
||||
"时": "Tund",
|
||||
"分": "Minut",
|
||||
"Amazon Alexa": "Amazoni Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Võite kasutada Alexa, et avada, lukustada ja kontrollida oleku lukus",
|
||||
"支持的国家": "Toetatud riigid",
|
||||
"支持的国家值": "USA, Kanada, Ühendkuningriik, Austraalia, India, Saksamaa, Prantsusmaa, Itaalia, Hispaania, Jaapan",
|
||||
"操作流程": "Käitamisprotsess",
|
||||
"操作流程值": "1 Lisa lukk ja värava Smart lock APP-ga\n\n2 Lubage luku kauglukustumise funktsiooni APP (see funktsioon on vaikimisi välja lülitatud). Kui sul seda valikut pole, ei toeta lukk Alexa\n\n3 Lisa oskusi Alexa ja lubada neid Smart lukk APP konto ja parool. Kui luba on edukas, võite avastada seadmeid konto alla\n\n4 Leia lukk Alexa rakendus, lülitada hääl ava funktsiooni ja määrata keele parooli\n\n5 Lukk saab töötada läbi Alexa",
|
||||
"Google Home": "Google kodu",
|
||||
"Action name": "Toimingu nimi",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Toetatud keeled",
|
||||
"英语": "Inglise keel",
|
||||
"Google Home操作流程的值": "1. Kasutage Smart lock APP lukud ja väravad\n\n2. Lubage APP luku kauglukust avamise funktsiooni (see funktsioon on vaikimisi välja lülitatud). Ilma selle valikuteta ei toeta lukk Google Kodu.\n\n3. Paigalda Google Home APP ja klõpsake \" \" nuppu ülemine vasak nurk\n\n4. Seadistused lehel valige \"Töö Google'ga\"\n\n5. Otsige \"ScienerSmart\" ja kasutage nutikas lukustatud APP konto ja parooli, et autoriseerida.",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Parool peab sisaldama vähemalt kahte järgmistest: numbreid, tähti ja erimärkid",
|
||||
"已开锁": "Lukustatud",
|
||||
"已闭锁": "Lukustatud",
|
||||
"两次密码不一致哦": "Paroolid ei ole järjekindlad"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Kun lukko on nollattu, metakarppinen suoneet poistetaan. Haluatko varmasti palauttaa?",
|
||||
"在线": "Verkossa",
|
||||
"离线": "Offline-verkosto"
|
||||
"离线": "Offline-verkosto",
|
||||
"购买记录": "Hankintamenettely",
|
||||
"使用记录": "Käyttäjätiedot",
|
||||
"失效时间要大于当前时间": "Päättymisajan on oltava pidempi kuin nykyinen aika.",
|
||||
"修改名字": "Muokkaa nimi",
|
||||
"时": "Tunti",
|
||||
"分": "Minuutti",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Voit käyttää Alexa avata, lukitse ja tarkistaa lukon tila",
|
||||
"支持的国家": "Tuetut maat",
|
||||
"支持的国家值": "Yhdysvallat, Kanada, Yhdistynyt kuningaskunta, Australia, Intia, Saksa, Ranska, Italia, Espanja, Japani",
|
||||
"操作流程": "Toimintaprosessi.",
|
||||
"操作流程值": "1 Lisää lukko ja portti Smart-lukko APP:n avulla\n\n2 Ota APP-lukon etälukutustoiminto (tämä toiminto on oletuksena pois päältä). Jos sinulla ei ole tätä vaihtoehtoa, lukko ei tue Alexa\n\n3 Lisää taitoja Alexa ja valtuuttaa ne Smart lukko APP tili ja salasana. Kun valtuutus on onnistunut, voit löytää laitteet tililä\n\n4 Etsi lukko Alexa-sovelluksessa, käynnistä ääni avautuminen ja asettaa kieli salasanan\n\n5 Lukko voidaan käyttää Alexan kautta",
|
||||
"Google Home": "Google-koti",
|
||||
"Action name": "Toiminnan nimi",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Tuetut kielet",
|
||||
"英语": "Englanti",
|
||||
"Google Home操作流程的值": "1. Käytä Smart-lukko APP lisää lukkoja ja portteja\n\n2. Ota APP-lukon etälukutustoiminto (tämä toiminto on oletuksena sammutettu). Ilman tätä vaihtoehtoa lukko ei tue Google Homes\n\n3. Asenna Google Home APP ja klikkaa \" \" painiketta vasemmassa yläkulmassa.\n\n4. Valitse Asetukset sivulla \"Työ Googlen kanssa\"\n\n5. Etsi \"ScienerSmart\" ja käyttää älykkää lukko APP-tiliä ja salasanaa valtuuttaakseen",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Salasanassa on oltava vähintään kaksi seuraavista: numeroita, kirjaimia ja erityismerkkejä",
|
||||
"已开锁": "Avaa lukitus",
|
||||
"已闭锁": "Lukittu",
|
||||
"两次密码不一致哦": "Salasanat ovat epäjohdonmukaiset."
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Après réinitialisation, les veines métacarpiennes de la serrure seront supprimées. Êtes-vous sûr de vouloir réinitialiser?",
|
||||
"在线": "En ligne",
|
||||
"离线": "Hors ligne"
|
||||
"离线": "Hors ligne",
|
||||
"购买记录": "Dossier d'achat",
|
||||
"使用记录": "Enregistrement de l'utilisateur",
|
||||
"失效时间要大于当前时间": "Le délai d'expiration doit être plus long que l'heure actuelle",
|
||||
"修改名字": "Modifier le nom",
|
||||
"时": "Heure",
|
||||
"分": "Minute",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Vous pouvez utiliser Alexa pour déverrouiller, verrouiller et vérifier l'état du verrouillage",
|
||||
"支持的国家": "Pays soutenus",
|
||||
"支持的国家值": "États-Unis, Canada, Royaume-Uni, Australie, Inde, Allemagne, France, Italie, Espagne, Japon",
|
||||
"操作流程": "Processus d'opération",
|
||||
"操作流程值": "1 Ajoutez un verrou et une passerelle avec l'application Smart Lock\n\n2 Activez la fonction de déverrouillage à distance du verrou dans l'APP (cette fonction est désactivée par défaut). Si vous n'avez pas cette option, le verrou ne prend pas en charge Alexa\n\n3 Ajoutez des compétences à Alexa et autorisez-les avec le compte et le mot de passe de l'application Smart Lock. Une fois l'autorisation réussie, vous pouvez découvrir les appareils sous le compte\n\n4 Localisez le verrou dans l'application Alexa, activez la fonction de déverrouillage vocal et définissez le mot de passe linguistique\n\n5 La serrure peut être actionnée par Alexa",
|
||||
"Google Home": "Accueil Google",
|
||||
"Action name": "Nom de l'action",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Langues prises en charge",
|
||||
"英语": "Anglais",
|
||||
"Google Home操作流程的值": "1. Utilisez l'application Smart Lock pour ajouter des verrous et des passerelles\n\n2. activer la fonction de déverrouillage à distance de la serrure dans l'application (cette fonction est désactivée par défaut). Sans cette option, le verrou ne prend pas en charge Google Home\n\n3. Installez l'application Google Home et cliquez sur le bouton \"\" dans le coin supérieur gauche\n\n4. Sur la page Paramètres, sélectionnez \"Travailler avec Google\"\n\n5. recherchez \"ScienerSmart\" et utilisez le compte APP de verrouillage intelligent et le mot de passe pour autoriser",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Le mot de passe doit contenir au moins deux des éléments suivants: chiffres, lettres et caractères spéciaux",
|
||||
"已开锁": "Déverrouillé",
|
||||
"已闭锁": "Verrouillé",
|
||||
"两次密码不一致哦": "Les mots de passe sont incohérents"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "לאחר איפוס, הורידים של המנעול יימחקו. אתה בטוח שברצונך לאפס?",
|
||||
"在线": "באינטרנט",
|
||||
"离线": "מנותק"
|
||||
"离线": "מנותק",
|
||||
"购买记录": "רישום רכישה",
|
||||
"使用记录": "רשומות משתמש",
|
||||
"失效时间要大于当前时间": "זמן המימוש חייב להיות ארוך יותר מאשר הזמן הנוכחי",
|
||||
"修改名字": "שם עריכה",
|
||||
"时": "שעה",
|
||||
"分": "דקה",
|
||||
"Amazon Alexa": "אלכס",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "אתה יכול להשתמש alexa כדי לפתוח, לנעול ולבדוק את מצב המנעול",
|
||||
"支持的国家": "מדינות נתמכות",
|
||||
"支持的国家值": "Usa, canada, uk, אוסטרליה, הודו, germany, צרפת, איטליה, ספרד, ספרד, יפן",
|
||||
"操作流程": "תהליך פעולה",
|
||||
"操作流程值": "1 להוסיף מנעול ושער עם אפליקציית נעילה חכמה\n\n2 הפעל את הפונקציה unlocking מרחוק של המנעול באפליקציה (פונקציה זו מכבה כברירת מחדל). אם אין לך אפשרות זו, המנעול לא תומך באלכסנa\n\n3 להוסיף מיומנויות כדי alexa ולאשר להם את החשבון ואת הסיסמה של האפליקציה המנעול החכם. לאחר האישור מוצלח, אתה יכול לגלות התקנים תחת החשבון\n\n4 לאתר את המנעול באפליקציית alexa, הפעל את פונקצית נעילת הקול, ולהגדיר את הסיסמה השפה\n\n5 המנעול יכול להיות מופעל באמצעות alexa",
|
||||
"Google Home": "בית גוגל",
|
||||
"Action name": "שם פעולה",
|
||||
"ScienerSmart": "נדוש",
|
||||
"支持的语言": "שפות נתמכות",
|
||||
"英语": "אנגלית",
|
||||
"Google Home操作流程的值": "1. השתמש ביישום מנעול חכם כדי להוסיף מנעולים ושערים\n\n2. הפעל את הפונקציה unlocking מרחוק של הנעילה באפליקציה (פונקציה זו מכבה כברירת מחדל). ללא אפשרות זו, המנעול אינו תומך בבית גוגל\n\n3. להתקין את אפליקציית הבית של גוגל ולחץ על כפתור \"בפינה השמאלית העליונה\n\n4. בדף ההגדרות, בחר \"עבודה עם Google\"\n\n5. חיפוש אחר \"scienersmart\" ולהשתמש חשבון יישום נעילה חכם וסיסמה כדי לאשר",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "הסיסמה חייבת להכיל לפחות 2 מאלה: מספרים, אותיות ותווים מיוחדים",
|
||||
"已开锁": "נעול",
|
||||
"已闭锁": "נעול",
|
||||
"两次密码不一致哦": "הסיסמאות אינן עקביות"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Nakon resetiranja, metakarpalne vene brave će biti izbrisane. Jeste li sigurni da želite resetiranje?",
|
||||
"在线": "Na internetu",
|
||||
"离线": "Odspojeno"
|
||||
"离线": "Odspojeno",
|
||||
"购买记录": "Podaci o prodaji",
|
||||
"使用记录": "Korisnički zapisi",
|
||||
"失效时间要大于当前时间": "Vrijeme isteka mora biti duže od trenutnog vremena",
|
||||
"修改名字": "Uredi ime:",
|
||||
"时": "Sat",
|
||||
"分": "Minute",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Možete koristiti Alexu za otključavanje, zaključati i provjeriti status brave.",
|
||||
"支持的国家": "Podržane države",
|
||||
"支持的国家值": "SAD, Kanada, Velika Britanija, Australija, Indija, Njemačka, Francuska, Italija, Španjolska, Japana",
|
||||
"操作流程": "Proces operacije",
|
||||
"操作流程值": "1 Dodajte bravu i prolaz s Smart zaključavanje APP-a\n\n2 Omogućite daljinsku funkciju otključavanja brave u APP (ova funkcija je zadano isključena). Ako nemate ovu opciju, brava ne podržava Alexu\n\n3 Dodati vještine Alexa i odobriti ih s Smart lock APP račun i lozinku. Nakon što je ovlaštenje uspješno, možete otkriti uređaje ispod računa\n\n4 Pronađite bravu u Alexa aplikacija, uključi glas otključavanje funkcije, i postavite jezičnu lozinku.\n\n5 brava se može upravljati preko Alexa",
|
||||
"Google Home": "Google kuća",
|
||||
"Action name": "Ime akcije",
|
||||
"ScienerSmart": "ZnanstvenikSmart",
|
||||
"支持的语言": "Podržani jezici",
|
||||
"英语": "EngleskiName",
|
||||
"Google Home操作流程的值": "1. Koristite Smart lock APP za dodavanje brava i prolaza\n\n2. Omogućite daljinsku funkciju otključavanja brave u APP (ova funkcija je zadano isključena). Bez ove opcije, brava ne podržava Google HomeName\n\n3. Instalirajte Google Home APP i kliknite \" \" gumb u gornjem lijevom kutu\n\n4. Na stranici podešavanja odaberite \"Radi s Googleom\"\n\n5. Tražite \"ScienerSmart\" i upotrijebite pametni APP račun i lozinku za ovlašćenje",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Lozinka mora sadržavati najmanje 2 od sljedećih: brojeve, slova i posebne znakove",
|
||||
"已开锁": "Otključan",
|
||||
"已闭锁": "Zaključano",
|
||||
"两次密码不一致哦": "Šifre nisu dosljedne"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "A reset után a zár metakarpális erei törlődnek. Biztos vagy benne, hogy vissza akarsz állítani?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Vásárlási rekord",
|
||||
"使用记录": "Felhasználói rekord",
|
||||
"失效时间要大于当前时间": "A lejárati időnek hosszabb kell lennie, mint a jelenlegi idő",
|
||||
"修改名字": "Név szerkesztése",
|
||||
"时": "Óra",
|
||||
"分": "Perc",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexa segítségével kinyit, zár és ellenőrizze a zár állapotát",
|
||||
"支持的国家": "Támogatott országok",
|
||||
"支持的国家值": "Usa, kanada, egyesült királyság, ausztrália, india, németország, franciaország, olaszország, spanyolország, japán",
|
||||
"操作流程": "Műveleti folyamat",
|
||||
"操作流程值": "1 egy zár és átjáró hozzáadása a smart lock alkalmazással\n\n2 engedélyezze az alkalmazásban lévő zár távoli feloldási funkcióját (ez a funkció alapértelmezés szerint kikapcsolt). Ha nem rendelkezik ezzel a lehetőséggel, a zár nem támogatja az alexát\n\n3 adjunk hozzá készségek alexa, és engedélyezze őket a smart lock app fiókját és jelszavát. Miután az engedélyezés sikeres, a fiók alatti eszközöket fedezhet fel\n\n4 keresse meg a zár az alexa app, kapcsolja be a hang kinyit funkció, és állítsa be a nyelv jelszó\n\n5 a zár lehet működtetni keresztül alexa",
|
||||
"Google Home": "Google home",
|
||||
"Action name": "Akció neve",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Támogatott nyelvek",
|
||||
"英语": "Angol",
|
||||
"Google Home操作流程的值": "1. használja az intelligens zár alkalmazást a zárak és átjárók hozzáadásához\n\n2. engedélyezze az alkalmazásban lévő zár távoli feloldási funkcióját (ez a funkció alapértelmezés szerint kikapcsolt). E lehetőség nélkül a zár nem támogatja a google home-t\n\n3. telepítse a google home alkalmazást, és kattintson a \"\" gombra a bal felső sarokban\n\n4. a beállítások oldalon válassza a \"munka a google\" lehetőséget\n\n5. keresse meg a \"scienersmart\" és használja a smart lock app fiókot és a jelszót, hogy engedélyezze",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "A jelszónak a következők közül legalább 2 kell tartalmaznia: számok, betűk és speciális karakterek",
|
||||
"已开锁": "Unlocked",
|
||||
"已闭锁": "Locked",
|
||||
"两次密码不一致哦": "A jelszavak nem következetesek"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Setelah mengulang, pembuluh darah metakarpal dari kunci akan dihapus. Yakin ingin mengatur ulang?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Catatan pembelian",
|
||||
"使用记录": "Catatan Pengguna",
|
||||
"失效时间要大于当前时间": "Waktu kedaluwarsa harus lebih lama dari waktu saat ini",
|
||||
"修改名字": "Edit nama",
|
||||
"时": "Jam",
|
||||
"分": "Menit",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Anda dapat menggunakan Alexa untuk membuka, mengunci dan memeriksa status kunci",
|
||||
"支持的国家": "Negara yang didukung",
|
||||
"支持的国家值": "AS, Kanada, Inggris Raya, Australia, India, Jerman, Prancis, Italia, Spanyol, Jepang",
|
||||
"操作流程": "Proses operasi",
|
||||
"操作流程值": "1 tambahkan kunci dan gateway dengan aplikasi kunci cerdas\n\n2 Aktifkan fungsi membuka kunci jarak jauh pada aplikasi (fungsi ini dinonaktifkan secara default). Jika Anda tidak memiliki opsi ini, kunci tidak mendukung Alexa\n\n3 tambahkan keterampilan untuk Alexa dan otorisasi akun dan kata sandi aplikasi Smart lock. Setelah otorisasi berhasil, Anda dapat menemukan perangkat di bawah akun\n\n4 temukan kunci di aplikasi Alexa, nyalakan fungsi Buka kunci suara, dan atur kata sandi bahasa\n\n5 kunci dapat dioperasikan melalui Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Nama Aksi",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Bahasa yang didukung",
|
||||
"英语": "Inggris",
|
||||
"Google Home操作流程的值": "1. Gunakan aplikasi kunci cerdas untuk menambahkan kunci dan gerbang\n\n2. Aktifkan fungsi membuka kunci jarak jauh pada aplikasi (fungsi ini dinonaktifkan secara default). Tanpa opsi ini, kunci tidak mendukung Google Home\n\n3. Pasang aplikasi Google Home dan klik tombol \"di sudut kiri atas\n\n4. Pada halaman pengaturan, pilih bekerja dengan Google\n\n5. Cari \"ScienerSmart\" dan gunakan akun aplikasi kunci pintar dan kata sandi untuk mengotorisasi",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Kata sandi harus berisi setidaknya 2 karakter berikut: angka, huruf, dan karakter khusus",
|
||||
"已开锁": "Tidak terkunci",
|
||||
"已闭锁": "Terkunci",
|
||||
"两次密码不一致哦": "Kata sandi tidak konsisten"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Dopo il reset, le vene metacarpali della serratura verranno cancellate. Sei sicuro di voler reimpostare?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Record di acquisto",
|
||||
"使用记录": "Registrazione utente",
|
||||
"失效时间要大于当前时间": "Il tempo di scadenza deve essere più lungo dell'ora corrente",
|
||||
"修改名字": "Modifica nome",
|
||||
"时": "Ora",
|
||||
"分": "Minuto",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "È possibile utilizzare Alexa per sbloccare, bloccare e controllare lo stato di blocco",
|
||||
"支持的国家": "Paesi supportati",
|
||||
"支持的国家值": "USA, Canada, Regno Unito, Australia, India, Germania, Francia, Italia, Spagna, Giappone",
|
||||
"操作流程": "Processo di funzionamento",
|
||||
"操作流程值": "1 Aggiungi un lucchetto e un gateway con l'APP Smart Lock\n\n2 Abilita la funzione di sblocco remoto del blocco nell'APP (questa funzione è disattivata per impostazione predefinita). Se non hai questa opzione, il blocco non supporta Alexa\n\n3 Aggiungi competenze ad Alexa e autorizzale con l'account e la password dell'APP Smart Lock. Una volta completata l'autorizzazione, puoi scoprire i dispositivi sotto l'account\n\n4 Individuare il blocco nell'app Alexa, attivare la funzione di sblocco vocale e impostare la password della lingua\n\n5 La serratura può essere azionata tramite Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Nome azione",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Lingue supportate",
|
||||
"英语": "Inglese",
|
||||
"Google Home操作流程的值": "1. Utilizzare l'APP Smart Lock per aggiungere serrature e gateway\n\n2. Abilita la funzione di sblocco remoto del blocco nell'APP (questa funzione è disattivata per impostazione predefinita). Senza questa opzione, il blocco non supporta Google Home\n\n3. Installare l'APP Google Home e fare clic sul pulsante \"\" nell'angolo in alto a sinistra\n\n4. Nella pagina Impostazioni, seleziona \"Lavora con Google\"\n\n5. Cerca \"ScienerSmart\" e utilizza l'account e la password APP smart lock per autorizzare",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "La password deve contenere almeno 2 dei seguenti: numeri, lettere e caratteri speciali",
|
||||
"已开锁": "Sbloccato",
|
||||
"已闭锁": "Bloccato",
|
||||
"两次密码不一致哦": "Le password sono incoerenti"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "リセット後、ロックの中手骨静脈が削除されます。リセットしてもよろしいですか。",
|
||||
"在线": "オンライン",
|
||||
"离线": "オフライン"
|
||||
"离线": "オフライン",
|
||||
"购买记录": "購入記録",
|
||||
"使用记录": "ユーザーレコード",
|
||||
"失效时间要大于当前时间": "有効期限は現在の時間より長くなければなりません",
|
||||
"修改名字": "名前を編集",
|
||||
"时": "時間",
|
||||
"分": "分",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexaを使用して、ロックステータスのロックを解除、ロック、および確認できます。",
|
||||
"支持的国家": "支えられた国",
|
||||
"支持的国家值": "米国、カナダ、イギリス、オーストラリア、インド、ドイツ、フランス、イタリア、スペイン、日本",
|
||||
"操作流程": "操作プロセス",
|
||||
"操作流程值": "1スマートロックアプリでロックとゲートウェイを追加する\n\n2 APPでロックのリモートロック解除機能を有効にします (この機能はデフォルトでオフになっています)。このオプションがない場合、ロックはAlexaをサポートしていません\n\n3 Alexaにスキルを追加し、Smart lock APPのアカウントとパスワードでそれらを承認します。承認が成功すると、アカウントの下にあるデバイスを検出できます。\n\n4 Alexaアプリでロックを見つけ、音声ロック解除機能をオンにして、言語パスワードを設定します\n\n5ロックはAlexaを通して操作することができます",
|
||||
"Google Home": "Googleホーム",
|
||||
"Action name": "アクション名",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "サポートされている言語",
|
||||
"英语": "英語",
|
||||
"Google Home操作流程的值": "1.スマートロックアプリを使用してロックとゲートウェイを追加する\n\n2.APPでロックのリモートロック解除機能を有効にします (この機能はデフォルトでオフになっています)。このオプションがないと、ロックはGoogle Homeをサポートしません\n\n3.Google Home APPをインストールし、左上隅の「」ボタンをクリックします\n\n4.設定ページで、「Googleで作業する」を選択します\n\n5.「ScienerSmart」を検索し、スマートロックAPPアカウントとパスワードを使用して承認する",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "パスワードには、数字、文字、特殊文字のうち少なくとも2つを含める必要があります。",
|
||||
"已开锁": "ロック解除",
|
||||
"已闭锁": "ロック済み",
|
||||
"两次密码不一致哦": "パスワードが一致しない"
|
||||
}
|
||||
@ -1090,5 +1090,23 @@
|
||||
"失效时间要大于当前时间": "失效时间要大于当前时间",
|
||||
"修改名字": "修改名字",
|
||||
"时": "时",
|
||||
"分": "分"
|
||||
"分": "分",
|
||||
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa进行开锁、闭锁和查看锁状态",
|
||||
"支持的国家": "支持的国家",
|
||||
"支持的国家值": "美国、加拿大、英国、澳大利亚、印度、德国、法国、意大利、西班牙、日本",
|
||||
"操作流程": "操作流程",
|
||||
"操作流程值":"1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Alexa \n\n3 在Alexa中添加Skill,并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁,开启语音开锁的功能,并设置语言密码\n\n5 可以通过Alexa操作锁了",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Action name",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "支持的语言",
|
||||
"英语": "英语",
|
||||
"Google Home操作流程的值": "1.用智能锁APP添加锁和网关\n\n2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home \n\n3.安装Google Home APP,点击左上角的“+”按钮\n\n4.在设置页面,选择“与Google协同工作”\n\n5.搜索“ScienerSmart”,并用智能锁APP的账号和密码进行授权\n\n",
|
||||
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合",
|
||||
"已开锁": "已开锁",
|
||||
"已闭锁": "已闭锁",
|
||||
"两次密码不一致哦": "两次密码不一致哦"
|
||||
}
|
||||
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Қайта ысырып тастағаннан соң бұғаттағы метакарпалар өшіріледі. Шынымен ысырып тастауды қалайсыз ба?",
|
||||
"在线": "Онлайн",
|
||||
"离线": "Желіде емес"
|
||||
"离线": "Желіде емес",
|
||||
"购买记录": "Сөндіру жазу",
|
||||
"使用记录": "Пайдаланушы жазу",
|
||||
"失效时间要大于当前时间": "Уақыт уақыты назардағы уақыттан артық болу керек.",
|
||||
"修改名字": "Атауы өңдеу",
|
||||
"时": "Сағат",
|
||||
"分": "Минуты",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Бұғат күй- жайын шектеу үшін Alexa қолдануға, бұғаттап тексеру",
|
||||
"支持的国家": "Қолданысталған елдер",
|
||||
"支持的国家值": "Америка, Канада, Британия, Австралия, Индия, Германия, Франция, Италия, Испания, Япония, Япония.",
|
||||
"操作流程": "Әрекет процесі",
|
||||
"操作流程值": "1 Smart Lock APP- ғазамен бұғаттау мен шүшін\n\n2 APP- ге бұғатталған қашықтағы бұғаттау функциясын рұқсат ету Егер бұл параметрі жоқ болса, блокта Alexa қолдамайды\n\n3 Alexa дегенге бақылауды қосып, оларды Smart Lock APP тіркелгі мен паролін рұқсат ету. Құрылғының сәтті тіркелгісінде құрылғыларды табыла аласыз.\n\n4 Alexa қолданбасында блоктауды орнатыңыз, дақы бұғаттап тіл парольді орнату\n\n5 Бұқсат Alexa арнайы қолданылсын",
|
||||
"Google Home": "Google Мекені",
|
||||
"Action name": "Әрекет атауы",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Қолдайтын тілдер",
|
||||
"英语": "Англияс",
|
||||
"Google Home操作流程的值": "1. Бұғаттарды мен шшұрарды қосу үшін Smart Lock APP қолданылсын\n\n2. APP- ге блоктасын қашықтағы бұғаттау функциясын рұқсат ету Бұл құсбелгіні блоктау Google Home қолдамайды\n\n3. Google Home APP- енді орнатып, жоғарғы сол жақтағы батырмасын басыңын\n\n4. Баптаулар бетінде \"Google with Joork\" дегенді таңдаңыз\n\n5. \"ScienerSmart\" іздеп, Smart Lock APP тіркелгі тіркелгі мен паролін рұқсат ету үшін қолданылсын",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Парольді келесінің кемінде 2- кемде болу керек: сандар, әріптер мен арнаулы таңбалары",
|
||||
"已开锁": "Жүктеу",
|
||||
"已闭锁": "Бұғатталған",
|
||||
"两次密码不一致哦": "Парольдер болмаған"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "재설정 후 잠금 장치의 중수골 정맥이 삭제됩니다. 당신은 당신이 재설정 하시겠습니까?",
|
||||
"在线": "온라인",
|
||||
"离线": "오프라인"
|
||||
"离线": "오프라인",
|
||||
"购买记录": "구매 기록",
|
||||
"使用记录": "사용자 기록",
|
||||
"失效时间要大于当前时间": "만료 시간은 현재 시간보다 길어야합니다.",
|
||||
"修改名字": "이름 편집",
|
||||
"时": "시간",
|
||||
"分": "분",
|
||||
"Amazon Alexa": "아마존 알렉사",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Alexa를 사용하여 잠금 상태를 잠금 해제, 잠금 및 확인할 수 있습니다.",
|
||||
"支持的国家": "지원되는 국가",
|
||||
"支持的国家值": "미국, 캐나다, 영국, 호주, 인도, 독일, 프랑스, 이탈리아, 스페인, 일본",
|
||||
"操作流程": "운영 프로세스",
|
||||
"操作流程值": "1 스마트 잠금 앱으로 잠금 및 게이트웨이 추가\n\n2 APP에서 잠금 장치의 원격 잠금 해제 기능을 활성화하십시오 (이 기능은 기본적으로 꺼져 있음). 이 옵션이 없으면 잠금 장치가 Alexa를 지원하지 않습니다.\n\n3 Alexa에 기술을 추가하고 스마트 잠금 APP의 계정과 암호로 권한을 부여합니다. 승인이 성공하면 계정에서 장치를 발견 할 수 있습니다.\n\n4 Alexa 앱에서 잠금을 찾아 음성 잠금 해제 기능을 켜고 언어 암호를 설정하십시오.\n\n5 자물쇠는 Alexa를 통해 운영될 수 있습니다",
|
||||
"Google Home": "구글 홈",
|
||||
"Action name": "액션 이름",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "지원되는 언어",
|
||||
"英语": "영어",
|
||||
"Google Home操作流程的值": "1. 잠금 장치 및 게이트웨이를 추가하려면 스마트 잠금 응용 프로그램을 사용하십시오.\n\n2. APP에서 잠금 장치의 원격 잠금 해제 기능을 활성화하십시오 (이 기능은 기본적으로 꺼져 있습니다). 이 옵션이 없으면 잠금 장치가 Google Home을 지원하지 않습니다.\n\n3. Google Home 앱을 설치하고 왼쪽 상단에있는 \"\" 버튼을 클릭하십시오.\n\n4. 설정 페이지에서 \"Google로 작업\" 을 선택하십시오.\n\n5. \"ScienerSmart\" 를 검색하고 스마트 잠금 APP 계정과 암호를 사용하여 권한을 부여하십시오.",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "암호에는 숫자, 문자 및 특수 문자 중 2 개 이상이 있어야합니다.",
|
||||
"已开锁": "잠금 해제",
|
||||
"已闭锁": "잠긴",
|
||||
"两次密码不一致哦": "암호가 일치하지 않습니다."
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po reset užrakto metakarpinės venos bus ištrintos. Ar tikrai norite atstatyti?",
|
||||
"在线": "Online",
|
||||
"离线": "Neprisijungęs"
|
||||
"离线": "Neprisijungęs",
|
||||
"购买记录": "Pirkimo įrašas",
|
||||
"使用记录": "Vartotojo įrašas",
|
||||
"失效时间要大于当前时间": "Galiojimo laikas turi būti ilgesnis nei dabartinis laikas",
|
||||
"修改名字": "Redaguoti pavadinimą",
|
||||
"时": "Valanda",
|
||||
"分": "Minutė",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Galite naudoti alexa atrakinti, užrakinti ir patikrinti užrakto būseną",
|
||||
"支持的国家": "Remiamos šalys",
|
||||
"支持的国家值": "Jav, kanada, jungtinė karalystė, australija, indija, vokietija, prancūzija, italija, ispanija, japonija",
|
||||
"操作流程": "Operacijos procesas",
|
||||
"操作流程值": "1 pridėkite užraktą ir vartus su \"smart lock\" programa\n\n2 įjungti nuotolinio užrakinimo funkciją programoje (ši funkcija pagal numatytuosius nustatymus išjungta). Jei jūs neturite šią parinktį, užraktas nepalaiko alexa\n\n3 pridėti įgūdžius alexa ir leisti juos su smart lock app paskyrą ir slaptažodį. Po to, kai leidimas bus sėkmingas, galite atrasti įrenginius pagal sąskaitą\n\n4 suraskite alexa programos užraktą, įjunkite balso atrakinimo funkciją ir nustatykite kalbos slaptažodį\n\n5 užraktas gali būti valdomas per alexa",
|
||||
"Google Home": "„ Google “namai",
|
||||
"Action name": "Veiksmo pavadinimas",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Palaikomos kalbos",
|
||||
"英语": "Anglų kalba",
|
||||
"Google Home操作流程的值": "1. naudokite \"smart lock\" programą, kad pridėtumėte spynos ir vartus\n\n2. įjungti nuotolinio užrakinimo funkciją programoje (ši funkcija pagal numatytuosius nustatymus išjungta). Be šios parinkties, užraktas nepalaiko \"google home\"\n\n3. įdiegti \"google home\" programą ir spustelėkite \"\" mygtuką viršutiniame kairiajame kampe\n\n4. nustatymų puslapyje pasirinkite \"dirbti su\" google\"\n\n5. ieškoti \"scienersmart\" ir naudoti \"smart lock\" programos sąskaitą ir slaptažodį autorizuoti",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Slaptažodyje turi būti bent 2 iš šių: skaičiai, raidės ir specialūs simboliai",
|
||||
"已开锁": "Atrakinta",
|
||||
"已闭锁": "Užrakinta",
|
||||
"两次密码不一致哦": "Slaptažodžiai yra nenuoseklūs"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Selepas menetapkan semula, urat metacarpal kunci akan dipadamkan. Adakah anda pasti anda mahu menetapkan semula?",
|
||||
"在线": "Dalam talian",
|
||||
"离线": "Luar talian"
|
||||
"离线": "Luar talian",
|
||||
"购买记录": "Rekod pembelian",
|
||||
"使用记录": "Rekod pengguna",
|
||||
"失效时间要大于当前时间": "Waktu tamat tempoh mestilah lebih lama daripada masa semasa",
|
||||
"修改名字": "Edit nama",
|
||||
"时": "Jam",
|
||||
"分": "Minit",
|
||||
"Amazon Alexa": "Alexa Amazon",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Anda boleh menggunakan Alexa untuk membuka kunci, mengunci dan menyemak status kunci",
|
||||
"支持的国家": "Negara-negara yang disokong",
|
||||
"支持的国家值": "Amerika syarikat, kanada, UK, Australia, India, jerman, perancis, itali, sepanyol, jepun",
|
||||
"操作流程": "Proses operasi",
|
||||
"操作流程值": "1 tambah kunci dan pintu masuk dengan aplikasi kunci pintar\n\n2 membolehkan fungsi membuka kunci kunci dalam aplikasi (fungsi ini dimatikan secara lalai). Jika anda tidak mempunyai pilihan ini, kunci tidak menyokong Alexa\n\n3 tambah kemahiran untuk Alexa dan memberi kuasa kepada mereka dengan akaun dan kata laluan Smart lock APP. Selepas kebenaran berjaya, anda boleh menemui peranti di bawah akaun\n\n4 cari kunci dalam app Alexa, hidupkan fungsi buka kunci suara, dan tetapkan kata laluan bahasa\n\n5 kunci boleh dikendalikan melalui Alexa",
|
||||
"Google Home": "Rumah Google",
|
||||
"Action name": "Nama tindakan",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Bahasa yang disokong",
|
||||
"英语": "Bahasa inggeris",
|
||||
"Google Home操作流程的值": "1. Gunakan aplikasi kunci pintar untuk menambah kunci dan pintu masuk\n\n2. Dayakan fungsi membuka kunci kunci dalam aplikasi (fungsi ini dimatikan secara lalai). Tanpa pilihan ini, kunci tidak menyokong rumah Google\n\n3. Pasang aplikasi Google Home dan klik butang \"\" di sudut kiri atas\n\n4. Pada halaman tetapan, pilih \"bekerja dengan Google\"\n\n5. Cari \"ScienerSmart\" dan gunakan akaun aplikasi kunci pintar dan kata laluan untuk memberi kuasa",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Kata laluan mesti mengandungi sekurang-kurangnya 2 daripada yang berikut: nombor, huruf, dan aksara khas",
|
||||
"已开锁": "Dikunci",
|
||||
"已闭锁": "Dikunci",
|
||||
"两次密码不一致哦": "Kata laluan tidak konsisten"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Na reset worden de middenhandsbeenaders van het slot verwijderd. Weet je zeker dat je wilt resetten?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Aankooprecord",
|
||||
"使用记录": "Gebruikersrecord",
|
||||
"失效时间要大于当前时间": "De vervaltijd moet langer zijn dan de huidige tijd",
|
||||
"修改名字": "Naam bewerken",
|
||||
"时": "Uur",
|
||||
"分": "Minuut",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Je kunt Alexa gebruiken om de vergrendelingsstatus te ontgrendelen, vergrendelen en controleren",
|
||||
"支持的国家": "Ondersteunde landen",
|
||||
"支持的国家值": "VS, Canada, VK, Australië, India, Duitsland, Frankrijk, Italië, Spanje, Japan",
|
||||
"操作流程": "Operatie proces",
|
||||
"操作流程值": "1 Voeg een slot en gateway toe met de Smart Lock APP\n\n2 Schakel de externe ontgrendelingsfunctie van het slot in de APP in (deze functie is standaard uitgeschakeld). Als u deze optie niet hebt, ondersteunt het slot Alexa niet\n\n3 Voeg vaardigheden toe aan Alexa en autoriseer ze met het account en wachtwoord van de Smart Lock APP. Nadat de autorisatie succesvol is, kunt u apparaten ontdekken onder het account\n\n4 Zoek het slot in de Alexa-app, schakel de spraakontgrendelingsfunctie in en stel het taalwachtwoord in\n\n5 Het slot kan worden bediend via Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Actienaam",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Ondersteunde talen",
|
||||
"英语": "Engels",
|
||||
"Google Home操作流程的值": "1. Gebruik de Smart Lock APP om sloten en gateways toe te voegen\n\n2. Schakel de externe ontgrendelingsfunctie van het slot in de APP in (deze functie is standaard uitgeschakeld). Zonder deze optie ondersteunt het slot Google Home niet\n\n3. Installeer de Google Home APP en klik op de knop \"\" in de linkerbovenhoek\n\n4. Selecteer op de pagina Instellingen \"Werken met Google\"\n\n5. Zoek naar \"ScienerSmart\" en gebruik de smart lock APP-account en het wachtwoord om te autoriseren",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Het wachtwoord moet ten minste 2 van de volgende bevatten: cijfers, letters en speciale tekens",
|
||||
"已开锁": "Ontgrendeld",
|
||||
"已闭锁": "Vergrendeld",
|
||||
"两次密码不一致哦": "De wachtwoorden zijn inconsistent"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po zresetowaniu żyły śródręcza zamka zostaną usunięte. Czy na pewno chcesz zresetować?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Rekord zakupu",
|
||||
"使用记录": "Rekord użytkownika",
|
||||
"失效时间要大于当前时间": "Czas wygaśnięcia musi być dłuższy niż aktualny czas",
|
||||
"修改名字": "Edytuj nazwę",
|
||||
"时": "Godzina",
|
||||
"分": "Minuta",
|
||||
"Amazon Alexa": "Amazonka Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Możesz użyć Alexy, aby odblokować, zablokować i sprawdzić status blokady",
|
||||
"支持的国家": "Kraje wspierane",
|
||||
"支持的国家值": "USA, Kanada, Wielka Brytania, Australia, Indie, Niemcy, Francja, Włochy, Hiszpania, Japonia",
|
||||
"操作流程": "Proces działania",
|
||||
"操作流程值": "1 Dodaj zamek i bramę za pomocą aplikacji Smart Lock\n\n2 Włącz funkcję zdalnego odblokowania blokady w aplikacji (ta funkcja jest domyślnie wyłączona). Jeśli nie masz tej opcji, zamek nie obsługuje Alexa\n\n3 Dodaj umiejętności do Alexy i autoryzuj je za pomocą konta i hasła aplikacji Smart lock. Po pomyślnym zakończeniu autoryzacji możesz odkryć urządzenia na koncie\n\n4 Zlokalizuj blokadę w aplikacji Alexa, włącz funkcję odblokowywania głosu i ustaw hasło językowe\n\n5 Zamek może być obsługiwany przez Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Nazwa działania",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Obsługiwane języki",
|
||||
"英语": "Angielski",
|
||||
"Google Home操作流程的值": "1. Użyj aplikacji Smart Lock, aby dodać zamki i bramy\n\n2. Włącz funkcję zdalnego odblokowania blokady w aplikacji (ta funkcja jest domyślnie wyłączona). Bez tej opcji blokada nie obsługuje Google Home\n\n3. Zainstaluj aplikację Google Home i kliknij przycisk „ ”w lewym górnym rogu\n\n4. Na stronie Ustawienia wybierz „ Pracuj z Google”\n\n5. Wyszukaj \"ScienerSmart\" i użyj konta i hasła Smart Lock APP do autoryzacji",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Hasło musi zawierać co najmniej 2 z następujących elementów: cyfry, litery i znaki specjalne",
|
||||
"已开锁": "Odblokowany",
|
||||
"已闭锁": "Zamknięty",
|
||||
"两次密码不一致哦": "Hasła są niespójne"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Após a reinicialização, as veias do metacarpo do bloqueio serão excluídas. Tens a certeza que queres reiniciar?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Comprar registro",
|
||||
"使用记录": "Registro do usuário",
|
||||
"失效时间要大于当前时间": "O tempo de expiração deve ser maior que o tempo atual",
|
||||
"修改名字": "Editar nome",
|
||||
"时": "Hora",
|
||||
"分": "Minuto",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Você pode usar Alexa para desbloquear, bloquear e verificar o status do bloqueio",
|
||||
"支持的国家": "Países suportados",
|
||||
"支持的国家值": "EUA, Canadá, Reino Unido, Austrália, Índia, Alemanha, França, Itália, Espanha, Japão",
|
||||
"操作流程": "Operação processo",
|
||||
"操作流程值": "1 Adicione um cadeado e gateway com o aplicativo Smart lock\n\n2 Ative a função de desbloqueio remoto do bloqueio no aplicativo (esta função está desativada por padrão). Se você não tiver essa opção, o bloqueio não suporta Alexa\n\n3 Adicione habilidades ao Alexa e autorize-as com a conta e a senha do aplicativo Smart lock. Depois que a autorização for bem-sucedida, você poderá descobrir dispositivos na conta\n\n4 Localize o bloqueio no aplicativo Alexa, ative a função de desbloqueio de voz e defina a senha do idioma\n\n5 O bloqueio pode ser operado através Alexa",
|
||||
"Google Home": "Casa do Google",
|
||||
"Action name": "Nome ação",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Idiomas suportados",
|
||||
"英语": "Português",
|
||||
"Google Home操作流程的值": "1. Use o aplicativo Smart lock para adicionar bloqueios e gateways\n\n2. Ative a função de desbloqueio remoto do bloqueio no APP (esta função está desativada por padrão). Sem essa opção, o bloqueio não suporta o Google Home\n\n3. Instale o Google Home APP e clique no botão \"\" no canto superior esquerdo\n\n4. Na página Configurações, selecione \"Trabalhar com o Google\"\n\n5. Procure por \"ScienerSmart\" e use a conta e a senha do APP do bloqueio inteligente para autorizar",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "A senha deve conter pelo menos 2 dos seguintes elementos: números, letras e caracteres especiais.",
|
||||
"已开锁": "Desbloqueado",
|
||||
"已闭锁": "Trancado",
|
||||
"两次密码不一致哦": "As senhas são inconsistentes"
|
||||
}
|
||||
@ -180,7 +180,7 @@
|
||||
"隐藏无效开锁权限": "Ascunde acces nevalid",
|
||||
"APP开锁时需手机连网的锁": "Încuietori care necesită telefon online",
|
||||
"增值服务": "Servicii",
|
||||
"关于": "Despre...",
|
||||
"关于": "Despre",
|
||||
"退出": "Autentificare",
|
||||
"删除账号": "Șterge cont",
|
||||
"个人信息": "Informații cont",
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "După resetare, venele metacarpale ale încuietorii vor fi şterse. Sigur doriți să resetați?",
|
||||
"在线": "Online",
|
||||
"离线": "Deconectat"
|
||||
"离线": "Deconectat",
|
||||
"购买记录": "Înregistrarea achiziției",
|
||||
"使用记录": "Înregistrare utilizator",
|
||||
"失效时间要大于当前时间": "Timpul de expirare trebuie să fie mai mare decât timpul curent.",
|
||||
"修改名字": "Editează nume",
|
||||
"时": "Oră",
|
||||
"分": "Minute",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Puteți folosi Alexa pentru a debloca, bloca și verifica starea de blocare a statului",
|
||||
"支持的国家": "Țări sprijinite",
|
||||
"支持的国家值": "Statele Unite ale Americii, Canada, Marea Britanie, Australia, India, Germania, Franța, Italia, Spania, Japonia",
|
||||
"操作流程": "Procesul operațional",
|
||||
"操作流程值": "1 Adăugați o blocare și o poartă cu Smart blocare APP\n\n2 Activați funcția de deblocare la distanță a încuietorii din APP (acesta funcție este oprită implicit). Dacă nu aveți această opțiune, blocarea nu suportă Alexa\n\n3 Adăugați abilități pentru Alexa și autorizați-le cu Smart blocare contul și parola APP. După ce autorizaţia va avea succes, puteţi descoperi dispozitivele sub cont\n\n4 Localizaţi blocarea în aplicaţia Alexa, activaţi funcţia de deblocare vocală, şi setaţi parola limbii\n\n5 Încuietoarea poate fi operată prin Alexa",
|
||||
"Google Home": "Acasă GoogleName",
|
||||
"Action name": "Nume acțiune",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Limbi suportate",
|
||||
"英语": "Engleză",
|
||||
"Google Home操作流程的值": "1. Utilizați Smart blocare APP pentru a adăuga încuietori și poartă\n\n2. Activaţi funcţia de deblocare la distanţă a blocării din APP (acesta funcţie este oprită în mod implicit). Fără această opțiune, blocarea nu suportă Google Home.\n\n3. Instalați Google Home APP și faceți clic pe butonul \" în colțul din stânga sus.\n\n4. Pe pagina Setări, selectați \"Lucrul cu Google\"\n\n5. Căutați \"ScienerSmart\" și utilizați contul de blocare inteligent APP și parola pentru a autoriza contul de blocare inteligentă",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Parola trebuie să conțină cel puțin 2 dintre următoarele: numere, litere și caractere speciale",
|
||||
"已开锁": "Deblocat",
|
||||
"已闭锁": "Blocat",
|
||||
"两次密码不一致哦": "Parolele sunt inconsistente"
|
||||
}
|
||||
@ -180,7 +180,7 @@
|
||||
"隐藏无效开锁权限": "Скрыть недопустимый доступ",
|
||||
"APP开锁时需手机连网的锁": "Замки требующие телефона онлайн",
|
||||
"增值服务": "Услуги",
|
||||
"关于": "О",
|
||||
"关于": "Касательно",
|
||||
"退出": "Выход",
|
||||
"删除账号": "Удалить аккаунт",
|
||||
"个人信息": "Информация счета",
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "После сброса пястные вены замка будут удалены. Вы уверены, что хотите сбросить?",
|
||||
"在线": "Онлайн",
|
||||
"离线": "Оффлайн"
|
||||
"离线": "Оффлайн",
|
||||
"购买记录": "Запись покупки",
|
||||
"使用记录": "Запись пользователя",
|
||||
"失效时间要大于当前时间": "Время истечения должно быть больше, чем текущее время",
|
||||
"修改名字": "Изменить имя",
|
||||
"时": "Час",
|
||||
"分": "Минута",
|
||||
"Amazon Alexa": "Амазон Алекса",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Вы можете использовать Alexa для разблокировки, блокировки и проверки состояния блокировки.",
|
||||
"支持的国家": "Поддерживаемые страны",
|
||||
"支持的国家值": "США, Канада, Великобритания, Австралия, Индия, Германия, Франция, Италия, Испания, Япония",
|
||||
"操作流程": "Процесс операции",
|
||||
"操作流程值": "1 Добавьте замок и шлюз с помощью приложения Smart Lock\n\n2 Включите функцию удаленной разблокировки замка в приложении (эта функция отключена по умолчанию). Если у вас нет этой опции, блокировка не поддерживает Alexa.\n\n3 Добавьте навыки в Alexa и авторизуйтесь с помощью учетной записи и пароля приложения Smart Lock. После успешной авторизации вы можете обнаружить устройства под учетной записью.\n\n4 Найдите замок в приложении Alexa, включите функцию голосовой разблокировки и установите языковой пароль.\n\n5 Замок можно управлять через Alexa",
|
||||
"Google Home": "Гугл Главная",
|
||||
"Action name": "Название действия",
|
||||
"ScienerSmart": "Сайенсмарт",
|
||||
"支持的语言": "Поддерживаемые языки",
|
||||
"英语": "Английский",
|
||||
"Google Home操作流程的值": "1. Используйте приложение Smart Lock для добавления замков и шлюзов.\n\n2. Включите функцию удаленной разблокировки замка в приложении (эта функция отключена по умолчанию). Без этой опции блокировка не поддерживает Google Home.\n\n3. Установите приложение Google Home и нажмите кнопку «» в верхнем левом углу.\n\n4. На странице настроек выберите «Работа с Google»\n\n5. Найдите «ScienerSmart» и используйте учетную запись приложения Smart Lock и пароль для авторизации.",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Пароль должен содержать не менее 2 из следующих символов: цифры, буквы и специальные символы.",
|
||||
"已开锁": "Разблокирован",
|
||||
"已闭锁": "Заперт",
|
||||
"两次密码不一致哦": "Пароли являются несовместимыми"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Po resetovaní budú metakarpálne žily zámku vymazané. Ste si istí, že chcete obnoviť?",
|
||||
"在线": "Online",
|
||||
"离线": "Offline"
|
||||
"离线": "Offline",
|
||||
"购买记录": "Zápis nákupu",
|
||||
"使用记录": "Záznam používateľa",
|
||||
"失效时间要大于当前时间": "Doba vypršania musí byť dlhšia ako aktuálny čas",
|
||||
"修改名字": "Upraviť názov",
|
||||
"时": "Hodina",
|
||||
"分": "Minúta",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Môžete použiť alexa odomknúť, zamknúť a skontrolovať stav zámku",
|
||||
"支持的国家": "Podporované krajiny",
|
||||
"支持的国家值": "Usa, kanada, veľká británia, austrália, india, nemecko, francúzsko, taliansko, španielsko, japonsko",
|
||||
"操作流程": "Prevádzkový proces",
|
||||
"操作流程值": "1 pridajte zámok a bránu s aplikáciou smart lock\n\n2 zapnite funkciu diaľkového odblokovania zámku v aplikácii (táto funkcia je predvolene vypnutá). Ak nemáte túto možnosť, zámok nepodporuje alexa\n\n3 pridajte zručnosti alexa a autorizujte ich pomocou účtu a hesla aplikácie smart lock. Po tom, čo je povolenie úspešné, môžete objaviť zariadenia pod účtom\n\n4 nájdite zámok v aplikácii alexa, zapnite funkciu odomknúť hlas a nastavte heslo jazyka\n\n5 zámok môže byť ovládaný cez alexa",
|
||||
"Google Home": "Google home",
|
||||
"Action name": "Názov akcie",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Podporované jazyky",
|
||||
"英语": "Angl.",
|
||||
"Google Home操作流程的值": "1. použite aplikáciu smart lock na pridanie zámkov a brán\n\n2. povoľte diaľkovú funkciu odblokovania zámku v aplikácii (táto funkcia je predvolene vypnutá). Bez tejto možnosti zámok nepodporuje google home\n\n3. nainštalujte aplikáciu google home a kliknite na tlačidlo \"\" v ľavom hornom rohu\n\n4. na stránke nastavenia vyberte \"práca s google\"\n\n5. vyhľadajte \"scienersmart\" a použite účet aplikácie smart lock a heslo na autorizáciu",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Heslo musí obsahovať najmenej 2 z nasledujúcich: čísla, písmená a špeciálne znaky",
|
||||
"已开锁": "Odomknuté",
|
||||
"已闭锁": "Uzamknutý",
|
||||
"两次密码不一致哦": "Heslá sú nekonzistentné"
|
||||
}
|
||||
@ -181,7 +181,7 @@
|
||||
"隐藏无效开锁权限": "Сакриј неважећи приступ",
|
||||
"APP开锁时需手机连网的锁": "Браве које захтевају телефон на мрежи",
|
||||
"增值服务": "Услуге",
|
||||
"关于": "О",
|
||||
"关于": "Povodom",
|
||||
"退出": "Одјавити се",
|
||||
"删除账号": "Избриши налог",
|
||||
"个人信息": "Информације о налогу",
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Након ресетовања, метакарпалне вене браве ће бити избрисане. Да ли сте сигурни да желите да ресетујете?",
|
||||
"在线": "Онлине",
|
||||
"离线": "Ванмрежне"
|
||||
"离线": "Ванмрежне",
|
||||
"购买记录": "Записник о куповини",
|
||||
"使用记录": "Кориснички запис",
|
||||
"失效时间要大于当前时间": "Време истека мора бити дуже од тренутног времена",
|
||||
"修改名字": "Измени име",
|
||||
"时": "Сат",
|
||||
"分": "Минут",
|
||||
"Amazon Alexa": "амазонка Алека",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Можете користити Алека за откључавање, закључавање и проверу статуса закључавања",
|
||||
"支持的国家": "Подржане земље",
|
||||
"支持的国家值": "САД , Канада, Велика Британија, Аустралија, Индија, Немачка, Француска, Италија, Шпанија, Јапан",
|
||||
"操作流程": "Процес рада",
|
||||
"操作流程值": "1 Додајте браву и капију са Смарт лоцк АПП\n\n2 Омогућите функцију даљинског откључавања браве у АПП (ова функција је подразумевано искључена). Ако немате ову опцију, брава не подржава Алека\n\n3 Додајте вештине Алека и овлашћују их са налогом и лозинком Смарт Лоцк АПП је. Након што је ауторизација успешна, можете открити уређаје под рачуном\n\n4 Пронађите браву у апликацији Алека, укључите функцију гласовног откључавања и подесите лозинку језика\n\n5 Брава се може управљати преко Алека",
|
||||
"Google Home": "Гугл почетна страница",
|
||||
"Action name": "Име акције",
|
||||
"ScienerSmart": "Српско-хрватски",
|
||||
"支持的语言": "Подржани језици",
|
||||
"英语": "Енглески",
|
||||
"Google Home操作流程的值": "1 . Користите Смарт Лоцк АПП да додате браве и гатеваи\n\n2 . Омогућите функцију даљинског откључавања браве у АПП-у (ова функција је подразумевано искључена). Без ове опције, брава не подржава Гоогле Хоме\n\n3 . Инсталирајте Гоогле Хоме АПП и кликните на дугме \"+\" у горњем левом углу\n\n4 . На страници Подешавања изаберите \"Рад са Гоогле-ом\"\n\n5 . Потражите \"СциенерСмарт\" и користите паметну браву АПП налог и лозинку за ауторизацију",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Лозинка мора да садржи најмање 2 од следећег: бројеве, слова и специјалне знакове",
|
||||
"已开锁": "Откљуиана",
|
||||
"已闭锁": "Закљуиана",
|
||||
"两次密码不一致哦": "Лозинке су недоследне"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Efter återställd, de metakarpal venerna i låset tas bort. Är du säker på att du vill återställa?",
|
||||
"在线": "Online:",
|
||||
"离线": "Frånkoppling"
|
||||
"离线": "Frånkoppling",
|
||||
"购买记录": "Inköpsregistret",
|
||||
"使用记录": "Användarlista",
|
||||
"失效时间要大于当前时间": "Utgångstiden måste vara längre än nuvarande tid.",
|
||||
"修改名字": "Redigera namn",
|
||||
"时": "Timme",
|
||||
"分": "Minuter",
|
||||
"Amazon Alexa": "Amazon- Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Du kan använda Alexa för att låsa upp, låsa och kontrollera låsstatus",
|
||||
"支持的国家": "Stödda länder",
|
||||
"支持的国家值": "USA, Kanada, Storbritannien, Australien, Indien, Tyskland, Frankrike, Italien, Spanien, Japan.",
|
||||
"操作流程": "Driftsprocess",
|
||||
"操作流程值": "1 Lägg till ett lås och gateway med Smart Lås APP\n\n2 Aktivera fjärrlåsningsfunktionen för låset i APP (denna funktion är avstängd som standard). Om du inte har det här alternativet stöder inte låset Alexa\n\n3 Lägg till färdigheter till Alexa och godkänna dem med Smart lås APP konto och lösenord. När auktorisationen är framgångsrik kan du upptäcka enheter under kontot\n\n4 Hitta låset i Alexa-appen, slå på röst upplåsningsfunktionen och ställa in språklösenordet.\n\n5 Låset kan manövreras genom Alexa",
|
||||
"Google Home": "Google HomeName",
|
||||
"Action name": "Åtgärdsnamn",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Stödda språk",
|
||||
"英语": "Engelska",
|
||||
"Google Home操作流程的值": "1. Använd Smart Lås APP för att lägga till lås och gateways\n\n2. Aktivera fjärrlåsningsfunktionen för låset i APP (denna funktion är avstängd som standard). Utan det här alternativet stöder inte låset Google Home.\n\n3. Installera Google Home APP och klicka på \" \" knappen i det övre vänstra hörnet.\n\n4. På sidan Inställningar, välj \"Arbeta med Google\"\n\n5. Sök efter \"ScienerSmart\" och använd smart Lock APP-konto och lösenord för att auktorisera",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Lösenordet måste innehålla minst två av följande: siffror, bokstäver och specialtecken.",
|
||||
"已开锁": "Olås",
|
||||
"已闭锁": "Låst",
|
||||
"两次密码不一致哦": "Lösenord är inkonsekventa"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "หลังจากรีเซ็ตแล้วหลอดเลือดดำ metacarpal ของล็อคจะถูกลบออกคุณแน่ใจว่าอยากจะรีเซ็ต?",
|
||||
"在线": "ออนไลน์ผ่าน",
|
||||
"离线": "ออฟไลน์"
|
||||
"离线": "ออฟไลน์",
|
||||
"购买记录": "บันทึกการซื้อ",
|
||||
"使用记录": "บันทึกผู้ใช้",
|
||||
"失效时间要大于当前时间": "วันหมดอายุต้องนานกว่าเวลาปัจจุบัน",
|
||||
"修改名字": "แก้ไขชื่อ",
|
||||
"时": "ชั่วโมงต่อชั่วโมง",
|
||||
"分": "นาทีของคุณ",
|
||||
"Amazon Alexa": "Amazon Alexa อเมซอน",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "คุณสามารถใช้ Alexa เพื่อปลดล็อกล็อกและตรวจสอบสถานะการล็อก",
|
||||
"支持的国家": "ประเทศที่รองรับ",
|
||||
"支持的国家值": "สหรัฐอเมริกา, แคนาดา, สหราชอาณาจักร, ออสเตรเลีย, อินเดีย, เยอรมนี, ฝรั่งเศส, อิตาลี, สเปน, ญี่ปุ่น",
|
||||
"操作流程": "ขั้นตอนการดำเนินงาน",
|
||||
"操作流程值": "1เพิ่มล็อคและเกตเวย์กับ APP ล็อคสมาร์ท\n\n2เปิดใช้งานฟังก์ชั่นปลดล็อคระยะไกลของล็อคใน App (ฟังก์ชั่นนี้ถูกปิดโดยค่าเริ่มต้น) หากคุณไม่มีตัวเลือกนี้ล็อคจะไม่รองรับ Alexa\n\n3เพิ่มทักษะให้กับ Alexa และอนุญาตให้พวกเขาด้วยบัญชีสมาร์ทล็อค APP และรหัสผ่านหลังจากการอนุมัติประสบความสำเร็จคุณสามารถค้นพบอุปกรณ์ภายใต้บัญชี\n\n4ค้นหาการล็อคในแอป Alexa เปิดฟังก์ชั่นปลดล็อคด้วยเสียงและตั้งรหัสผ่านภาษา\n\n5ล็อคสามารถทำงานผ่าน Alexa",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "ชื่อแอคชัน",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "ภาษาที่รองรับ",
|
||||
"英语": "ภาษาอังกฤษแบบสบายๆ",
|
||||
"Google Home操作流程的值": "1.ใช้แอป Smart Lock เพื่อเพิ่มล็อคและเกตเวย์\n\n2.เปิดใช้งานฟังก์ชั่นการปลดล็อกระยะไกลของล็อคในแอป (ฟังก์ชั่นนี้ถูกปิดโดยค่าเริ่มต้น) ไม่มีตัวเลือกนี้ล็อคไม่รองรับ Google Home\n\n3.ติดตั้งแอป Google Home และคลิกปุ่ม \"\" ที่มุมบนซ้าย\n\n4.ในหน้าการตั้งค่าให้เลือก \"ทำงานร่วมกับ Google\"\n\n5.ค้นหา \"scienersmart\" และใช้บัญชีแอปล็อคอัจฉริยะและรหัสผ่านเพื่ออนุญาต",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "รหัสผ่านต้องมีอย่างน้อย2รายการต่อไปนี้: ตัวเลขตัวอักษรและอักขระพิเศษ",
|
||||
"已开锁": "ปลดล็อคแล้ว",
|
||||
"已闭锁": "ล็อคล็อคได้",
|
||||
"两次密码不一致哦": "รหัสผ่านไม่สอดคล้องกัน"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sıfırlamadan sonra, kilidin metacarpal damarları silinecektir. Sıfırlamak istediğine emin misin?",
|
||||
"在线": "Çevrimiçi",
|
||||
"离线": "Çevrimdışı"
|
||||
"离线": "Çevrimdışı",
|
||||
"购买记录": "Satın alma kaydı",
|
||||
"使用记录": "Kullanıcı kaydı",
|
||||
"失效时间要大于当前时间": "Son kullanma süresi mevcut süreden daha uzun olmalıdır",
|
||||
"修改名字": "İsim düzenleme",
|
||||
"时": "Saat",
|
||||
"分": "Dakika",
|
||||
"Amazon Alexa": "Amazon alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Kilit durumunu açmak, kilitlemek ve kontrol etmek için alexa'yı kullanabilirsiniz",
|
||||
"支持的国家": "Desteklenen ülkeler",
|
||||
"支持的国家值": "Abd, kanada, İngiltere, avustralya, hindistan, almanya, fransa, İtalya, İspanya, japonya",
|
||||
"操作流程": "Operasyon süreci",
|
||||
"操作流程值": "1 akıllı kilit uygulaması ile bir kilit ve ağ geçidi ekleyin\n\n2 uygulamadaki kilidin uzaktan kilit açma işlevini etkinleştirin (bu işlev varsayılan olarak kapatılır). Bu seçeneğiniz yoksa, kilit alexa'yı desteklemiyor\n\n3 alexa'ya beceri ekleyin ve bunları akıllı kilit uygulamasının hesabı ve şifresiyle yetkilendirin. Yetkilendirme başarılı olduktan sonra, hesap altındaki cihazları keşfedebilirsiniz\n\n4 alexa uygulamasında kilidi bulun, ses açma işlevini açın ve dil şifresini ayarlayın\n\n5 kilit alexa ile çalıştırılabilir",
|
||||
"Google Home": "Google ev",
|
||||
"Action name": "Eylem adı",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Desteklenen diller",
|
||||
"英语": "İngilizce",
|
||||
"Google Home操作流程的值": "1. kilitler ve ağ geçitleri eklemek için akıllı kilit uygulamasını kullanın\n\n2. uygulamadaki kilidin uzaktan kilit açma işlevini etkinleştirin (bu işlev varsayılan olarak kapatılır). Bu seçenek olmadan, kilit google home'u desteklemiyor\n\n3. google home uygulamasını yükleyin ve sol üst köşedeki \"\" düğmesine tıklayın\n\n4. ayarlar sayfasında \"google ile çalış\" ı seçin\n\n5. \"scienersmart\" için arama yapın ve yetkilendirmek için akıllı kilit uygulaması hesabını ve şifresini kullanın",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Şifre aşağıdakilerden en az 2 tane içermelidir: sayılar, harfler ve özel karakterler",
|
||||
"已开锁": "Unlocked",
|
||||
"已闭锁": "Kilitli",
|
||||
"两次密码不一致哦": "Şifreler tutarsız"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "重置後,鎖的掌靜脈將被刪除。 是否確實要重置?",
|
||||
"在线": "在線",
|
||||
"离线": "離線"
|
||||
"离线": "離線",
|
||||
"购买记录": "採購記錄",
|
||||
"使用记录": "用戶記錄",
|
||||
"失效时间要大于当前时间": "過期時間必須長於當前時間",
|
||||
"修改名字": "編輯名稱",
|
||||
"时": "小時",
|
||||
"分": "分鐘",
|
||||
"Amazon Alexa": "亞馬遜Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa解鎖,鎖定和檢查鎖定狀態",
|
||||
"支持的国家": "支持的國家",
|
||||
"支持的国家值": "美國,加拿大,英國,澳大利亞,印度,德國,法國,意大利,西班牙,日本",
|
||||
"操作流程": "操作流程",
|
||||
"操作流程值": "1使用智能鎖應用程序添加鎖和網關\n\n2在應用程序中啟用鎖的遠程解鎖功能 (默認情況下此功能處於關閉狀態)。 如果您沒有此選項,則鎖不支持Alexa\n\n3向Alexa添加技能,並使用Smart lock應用程序的帳戶和密碼對其進行授權。 授權成功後,您可以發現該賬號下的設備\n\n4在Alexa應用程序中找到鎖,打開語音解鎖功能,並設置語言密碼\n\n5鎖可以通過Alexa操作",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "動作名稱",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "支持的語言",
|
||||
"英语": "英語",
|
||||
"Google Home操作流程的值": "1.使用智能鎖應用程序添加鎖和網關\n\n2.在應用程序中啟用鎖的遠程解鎖功能 (默認情況下此功能處於關閉狀態)。 如果沒有此選項,鎖不支持Google Home\n\n3.安裝Google Home應用程序,然後單擊左上角的 「」 按鈕\n\n4.在設置頁面上,選擇 「與Google合作」\n\n5.搜索 「scienershart」 並使用smart lock APP帳戶和密碼進行授權",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "密碼必須至少包含以下兩項: 數字、字母和特殊字符",
|
||||
"已开锁": "已解鎖",
|
||||
"已闭锁": "已鎖定",
|
||||
"两次密码不一致哦": "密碼不一致"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Після скидання п'ясткові вени замку будуть видалені. Ви впевнені, що хочете скинути налаштування?",
|
||||
"在线": "Онлайн",
|
||||
"离线": "Автономних"
|
||||
"离线": "Автономних",
|
||||
"购买记录": "Запис про покупку",
|
||||
"使用记录": "Запис користувача",
|
||||
"失效时间要大于当前时间": "Час експірації має бути довшим за поточний час",
|
||||
"修改名字": "Редагувати ім'я",
|
||||
"时": "година",
|
||||
"分": "хвилина",
|
||||
"Amazon Alexa": "Амазонка Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Ви можете використовувати Alexa для розблокування, блокування та перевірки статусу замка",
|
||||
"支持的国家": "Підтримувані країни",
|
||||
"支持的国家值": "США, Канада, Великобританія, Австралія, Індія, Німеччина, Франція, Італія, Іспанія, Японія",
|
||||
"操作流程": "Процес операції",
|
||||
"操作流程值": "1 Додайте замок і шлюз за допомогою програми Smart lock APP\n\n2 Увімкніть функцію дистанційного розблокування замка в APP (ця функція вимкнена за замовчуванням). Якщо у вас немає цієї опції, замок не підтримує Alexa\n\n3 Додайте навички до Alexa та авторизуйте їх за допомогою облікового запису та пароля програми Smart lock. Після успішної авторизації ви зможете виявити пристрої під обліковим записом\n\n4 Знайдіть замок у програмі Alexa, увімкніть функцію голосового розблокування та встановіть пароль мови\n\n5 Замком можна керувати через Alexa",
|
||||
"Google Home": "Домашня сторінка Google",
|
||||
"Action name": "Назва дії",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "Підтримувані мови",
|
||||
"英语": "Англійська",
|
||||
"Google Home操作流程的值": "1. Використовуйте додаток Smart lock, щоб додати замки та шлюзи\n\n2. Увімкніть функцію дистанційного розблокування замка в APP (ця функція вимкнена за замовчуванням). Без цієї опції замок не підтримує Google Home\n\n3. Встановіть додаток Google Home і натисніть кнопку «+» у верхньому лівому куті\n\n4. На сторінці налаштувань виберіть «Робота з Google»\n\n5. Знайдіть «ScienerSmart» і використовуйте обліковий запис і пароль APP smart lock для авторизації",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Пароль повинен містити не менше 2 з наступних: цифри, букви та спеціальні символи",
|
||||
"已开锁": "Розблокована",
|
||||
"已闭锁": "Заблокований",
|
||||
"两次密码不一致哦": "Паролі несумісні"
|
||||
}
|
||||
@ -1084,5 +1084,27 @@
|
||||
"丹麦语": "Dansk",
|
||||
"重置后,该锁的掌静脉都将被删除哦,确认要重置吗?": "Sau khi đặt lại, các tĩnh mạch metacarpal của khóa sẽ bị xóa. Bạn có chắc muốn thiết lập lại không?",
|
||||
"在线": "Trực tuyến",
|
||||
"离线": "Ngoại tuyến"
|
||||
"离线": "Ngoại tuyến",
|
||||
"购买记录": "Hồ Sơ mua hàng",
|
||||
"使用记录": "Bản ghi người dùng",
|
||||
"失效时间要大于当前时间": "Thời gian hết hạn phải dài hơn thời gian hiện tại",
|
||||
"修改名字": "Chỉnh sửa tên",
|
||||
"时": "Giờ",
|
||||
"分": "PHÚT",
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "Bạn có thể sử dụng Alexa để mở khóa, khóa và kiểm tra trạng thái khóa",
|
||||
"支持的国家": "Các Quốc Gia được hỗ trợ",
|
||||
"支持的国家值": "Mỹ, Canada, Anh, Úc, Ấn Độ, Đức, Pháp, Ý, Tây Ban Nha, Nhật Bản",
|
||||
"操作流程": "Quy trình vận hành",
|
||||
"操作流程值": "1 thêm khóa và cổng vào với ứng dụng Smart Lock\n\n2 Bật chức năng mở khóa từ xa của khóa trong ứng dụng (chức năng này bị tắt theo mặc định). Nếu bạn không có tùy chọn này, khóa không hỗ trợ Alexa\n\n3 thêm kỹ năng vào Alexa và ủy quyền cho họ bằng tài khoản và mật khẩu của ứng dụng Smart Lock. Sau khi ủy quyền thành công, bạn có thể khám phá các thiết bị trong tài khoản\n\n4 xác định vị trí khóa trong ứng dụng Alexa, bật chức năng mở khóa bằng giọng nói và đặt mật khẩu ngôn ngữ\n\n5 ổ khóa có thể hoạt động thông qua Alexa",
|
||||
"Google Home": "Trang chủ Google",
|
||||
"Action name": "Tên hành động",
|
||||
"ScienerSmart": "Scienersmart",
|
||||
"支持的语言": "Ngôn ngữ được hỗ trợ",
|
||||
"英语": "Tiếng Anh",
|
||||
"Google Home操作流程的值": "1. Sử dụng ứng dụng khóa thông minh để thêm khóa và cổng\n\n2. Kích hoạt chức năng mở khóa từ xa của khóa trong ứng dụng (chức năng này bị tắt theo mặc định). Không có tùy chọn này, khóa không hỗ trợ Google Home\n\n3. Cài đặt ứng dụng Google Home và nhấp vào nút \"\" ở góc trên cùng bên trái\n\n4. trên trang cài đặt, chọn \"làm việc với Google\"\n\n5. Tìm kiếm \"scienersmart\" và sử dụng tài khoản và mật khẩu ứng dụng Smart Lock để ủy quyền",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "Mật khẩu phải chứa ít nhất 2 trong số những điều sau: số, chữ cái và ký tự đặc biệt",
|
||||
"已开锁": "Đã mở khóa",
|
||||
"已闭锁": "Khóa",
|
||||
"两次密码不一致哦": "Mật khẩu không nhất quán"
|
||||
}
|
||||
@ -1091,17 +1091,22 @@
|
||||
"修改名字": "修改名字",
|
||||
"时": "时",
|
||||
"分": "分",
|
||||
|
||||
"Amazon Alexa": "Amazon Alexa",
|
||||
"您可以使用Alexa进行开锁、闭锁和查看锁状态": "您可以使用Alexa进行开锁、闭锁和查看锁状态",
|
||||
"支持的国家": "支持的国家",
|
||||
"支持的国家值": "美国、加拿大、英国、澳大利亚、印度、德国、法国、意大利、西班牙、日本",
|
||||
"操作流程": "操作流程",
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合",
|
||||
"操作流程值": "1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Alexa \n\n3 在Alexa中添加Skill,并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁,开启语音开锁的功能,并设置语言密码\n\n5 可以通过Alexa操作锁了",
|
||||
"操作流程值":"1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Alexa \n\n3 在Alexa中添加Skill,并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁,开启语音开锁的功能,并设置语言密码\n\n5 可以通过Alexa操作锁了",
|
||||
"Google Home": "Google Home",
|
||||
"Action name": "Action name",
|
||||
"ScienerSmart": "ScienerSmart",
|
||||
"支持的语言": "支持的语言",
|
||||
"英语": "英语",
|
||||
"Google Home操作流程的值": "1.用智能锁APP添加锁和网关\n\n2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home \n\n3.安装Google Home APP,点击左上角的“+”按钮\n\n4.在设置页面,选择“与Google协同工作”\n\n5.搜索“ScienerSmart”,并用智能锁APP的账号和密码进行授权\n\n"
|
||||
"Google Home操作流程的值": "1.用智能锁APP添加锁和网关\n\n2.在APP里开启锁的远程开锁功能(这个功能默认是关闭的)。如果没有这个选项,则锁不支持Google Home \n\n3.安装Google Home APP,点击左上角的“+”按钮\n\n4.在设置页面,选择“与Google协同工作”\n\n5.搜索“ScienerSmart”,并用智能锁APP的账号和密码进行授权\n\n",
|
||||
|
||||
"密码需至少包含数字/字母/字符中的2种组合": "密码需至少包含数字/字母/字符中的2种组合",
|
||||
"已开锁": "已开锁",
|
||||
"已闭锁": "已闭锁",
|
||||
"两次密码不一致哦": "两次密码不一致哦"
|
||||
}
|
||||
|
||||
@ -73,6 +73,7 @@ class BlueManage {
|
||||
List<int> lastTimeData = <int>[];
|
||||
int? dataLen;
|
||||
Timer? scanSingleTimer;
|
||||
bool needScanSingle = false;
|
||||
|
||||
static BlueManage? _manager;
|
||||
|
||||
@ -141,7 +142,8 @@ class BlueManage {
|
||||
}
|
||||
|
||||
/// 开始指定设备名称的扫描蓝牙设备
|
||||
Future<void> startScanSingle(String deviceName, int timeout, ScanDevicesCallBack scanDevicesCallBack) async {
|
||||
Future<void> startScanSingle(String deviceName, int timeout,
|
||||
ScanDevicesCallBack scanDevicesCallBack) async {
|
||||
final DateTime start = DateTime.now();
|
||||
FlutterBluePlus.isSupported.then((bool isAvailable) async {
|
||||
if (isAvailable) {
|
||||
@ -151,8 +153,7 @@ class BlueManage {
|
||||
BuglyTool.uploadException(
|
||||
message: '开始指定设备名称的扫描蓝牙设备',
|
||||
detail: '调用方法是:startScanSingle 指定设备名称是:$deviceName',
|
||||
upload: false
|
||||
);
|
||||
upload: false);
|
||||
//android 扫描比较慢,取样只要 3 分之一
|
||||
final int divisor = Platform.isAndroid ? 3 : 1;
|
||||
FlutterBluePlus.startScan(
|
||||
@ -172,9 +173,9 @@ class BlueManage {
|
||||
'扫描到的设备数:${results.length} 是否查找到 $isExit 以查找$milliseconds毫秒');
|
||||
BuglyTool.uploadException(
|
||||
message: '指定设备名称的扫描蓝牙设备 监听扫描结果',
|
||||
detail: 'startScanSingle$deviceName 监听扫描结果 是否查找到 $isExit 以查找$milliseconds毫秒 扫描到的设备数:${results.length} results:$results',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'startScanSingle$deviceName 监听扫描结果 是否查找到 $isExit 以查找$milliseconds毫秒 扫描到的设备数:${results.length} results:$results',
|
||||
upload: false);
|
||||
if (isExit) {
|
||||
for (final ScanResult scanResult in results) {
|
||||
if (((scanResult.advertisementData.serviceUuids.isNotEmpty
|
||||
@ -198,21 +199,22 @@ class BlueManage {
|
||||
}
|
||||
BuglyTool.uploadException(
|
||||
message: '遍历扫描到的结果跟缓存的结果对比,如果有最新的就更新缓存',
|
||||
detail: 'startScanSingle deviceName:$deviceName 查询到的结果scanResult:$scanResult',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'startScanSingle deviceName:$deviceName 查询到的结果scanResult:$scanResult',
|
||||
upload: false);
|
||||
}
|
||||
}
|
||||
|
||||
completer.complete();
|
||||
}
|
||||
}, onError: (e) {
|
||||
BuglyTool.uploadException(
|
||||
message: '指定设备名称的扫描蓝牙设备 监听扫描结果失败',
|
||||
detail: '打印失败问题 e:${e.toString()}',
|
||||
upload: false
|
||||
);
|
||||
AppLog.log('扫描失败:$e',);
|
||||
BuglyTool.uploadException(
|
||||
message: '指定设备名称的扫描蓝牙设备 监听扫描结果失败',
|
||||
detail: '打印失败问题 e:${e.toString()}',
|
||||
upload: false);
|
||||
AppLog.log(
|
||||
'扫描失败:$e',
|
||||
);
|
||||
});
|
||||
FlutterBluePlus.cancelWhenScanComplete(subscription);
|
||||
await completer.future;
|
||||
@ -222,8 +224,7 @@ class BlueManage {
|
||||
BuglyTool.uploadException(
|
||||
message: '指定设备名称的扫描蓝牙设备 内部逻辑整形失败',
|
||||
detail: 'tartScanSingle内部逻辑整形失败 e:${e.toString()}',
|
||||
upload: false
|
||||
);
|
||||
upload: false);
|
||||
AppLog.log('扫描失败');
|
||||
}
|
||||
} else {
|
||||
@ -311,26 +312,26 @@ class BlueManage {
|
||||
if (bluetoothConnectionState != BluetoothConnectionState.connected) {
|
||||
BuglyTool.uploadException(
|
||||
message: '点击按钮 蓝牙未连接 下一步扫描连接蓝牙',
|
||||
detail: 'blueSendData 蓝牙连接状态 bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'blueSendData 蓝牙连接状态 bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName',
|
||||
upload: false);
|
||||
_connect(deviceName, (BluetoothConnectionState state) {
|
||||
stateCallBack(bluetoothConnectionState!);
|
||||
}, isAddEquipment: isAddEquipment);
|
||||
} else {
|
||||
BuglyTool.uploadException(
|
||||
message: '点击按钮 蓝牙已经连接 下一步扫描连接蓝牙',
|
||||
detail: 'blueSendData 直接回调状态 蓝牙连接状态bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'blueSendData 直接回调状态 蓝牙连接状态bluetoothConnectionState:$bluetoothConnectionState deviceName:$deviceName',
|
||||
upload: false);
|
||||
stateCallBack(bluetoothConnectionState!);
|
||||
}
|
||||
} else {
|
||||
BuglyTool.uploadException(
|
||||
message: '点击按钮 蓝牙未打开',
|
||||
detail: 'blueSendData 蓝牙未打开--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'blueSendData 蓝牙未打开--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName',
|
||||
upload: false);
|
||||
try {
|
||||
stateCallBack(BluetoothConnectionState.disconnected);
|
||||
openBlue();
|
||||
@ -338,17 +339,16 @@ class BlueManage {
|
||||
AppLog.log('蓝牙打开失败');
|
||||
BuglyTool.uploadException(
|
||||
message: '点击按钮 蓝牙未打开 然后蓝牙打开失败',
|
||||
detail: 'blueSendData 蓝牙打开失败--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'blueSendData 蓝牙打开失败--_adapterState:${BluetoothAdapterState.on} deviceName:$deviceName',
|
||||
upload: false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
BuglyTool.uploadException(
|
||||
message: '点击按钮 蓝牙状态不可用',
|
||||
detail: 'blueSendData 蓝牙状态不可用--isAvailable:$isAvailable',
|
||||
upload: false
|
||||
);
|
||||
upload: false);
|
||||
stateCallBack(BluetoothConnectionState.disconnected);
|
||||
AppLog.log('开始扫描 蓝牙不可用,不能进行蓝牙操作');
|
||||
}
|
||||
@ -365,38 +365,74 @@ class BlueManage {
|
||||
// 是否有缓存设备 true是有缓存设备
|
||||
final bool isExistDevice = isExistScanDevices(connectDeviceName);
|
||||
// 是否是当前设备
|
||||
final bool isCurrentDevice = CommonDataManage().currentKeyInfo.lockName == deviceName;
|
||||
final bool isCurrentDevice =
|
||||
CommonDataManage().currentKeyInfo.lockName == deviceName;
|
||||
// mac地址
|
||||
final String? mac = CommonDataManage().currentKeyInfo.mac;
|
||||
|
||||
AppLog.log('开始连接 是否存在缓存:$isExistDevice 是否是当前设备:$isCurrentDevice mac:$mac');
|
||||
if (GetPlatform.isAndroid && !isExistDevice && isCurrentDevice && mac != null) {
|
||||
if (GetPlatform.isAndroid &&
|
||||
!isExistDevice &&
|
||||
isCurrentDevice &&
|
||||
mac != null) {
|
||||
// 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空
|
||||
BuglyTool.uploadException(
|
||||
message: '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect',
|
||||
detail: '调用方法_connect deviceName:$deviceName GetPlatform.isAndroid:${GetPlatform.isAndroid} isExistDevice:$isExistDevice mac:$mac',
|
||||
upload: false
|
||||
);
|
||||
scanSingleTimer?.cancel();
|
||||
detail:
|
||||
'调用方法_connect deviceName:$deviceName GetPlatform.isAndroid:${GetPlatform.isAndroid} isExistDevice:$isExistDevice mac:$mac needScanSingle:$needScanSingle',
|
||||
upload: false);
|
||||
// scanSingleTimer?.cancel();
|
||||
// 兼容android 的低配手机
|
||||
await doNotSearchBLE(mac, connectStateCallBack, isAddEquipment: isAddEquipment);
|
||||
//
|
||||
scanSingleTimer = Timer(3.seconds, () {
|
||||
scanSingleTimer?.cancel();
|
||||
try {
|
||||
if (!needScanSingle) {
|
||||
BuglyTool.uploadException(
|
||||
message:
|
||||
'开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect',
|
||||
detail: '调用方法doNotSearchBLE,直接连接,needScanSingle:$needScanSingle',
|
||||
upload: false);
|
||||
await doNotSearchBLE(mac, connectStateCallBack,
|
||||
isAddEquipment: isAddEquipment);
|
||||
} else {
|
||||
BuglyTool.uploadException(
|
||||
message:
|
||||
'开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect',
|
||||
detail:
|
||||
'调用方法startScanSingle,执行扫描函数,needScanSingle:$needScanSingle',
|
||||
upload: false);
|
||||
startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) {
|
||||
_connectDevice(scanDevices, deviceName, connectStateCallBack,
|
||||
isAddEquipment: isAddEquipment);
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
BuglyTool.uploadException(
|
||||
message: '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 3秒以后调用startScanSingle 上传记录当前方法是:_connect',
|
||||
detail: '_connect deviceName:$deviceName scanSingleTimer调用startScanSingle',
|
||||
upload: false
|
||||
);
|
||||
startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) => null);
|
||||
});
|
||||
message: '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 上传记录当前方法是:_connect',
|
||||
detail: '调用方法doNotSearchBLE发生异常,执行扫描函数 startScanSingle,异常信息:$e',
|
||||
upload: false);
|
||||
startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) {
|
||||
_connectDevice(scanDevices, deviceName, connectStateCallBack,
|
||||
isAddEquipment: isAddEquipment);
|
||||
});
|
||||
}
|
||||
//
|
||||
// scanSingleTimer = Timer(3.seconds, () {
|
||||
// scanSingleTimer?.cancel();
|
||||
// BuglyTool.uploadException(
|
||||
// message:
|
||||
// '开始连接 当是安卓设备 且不存在缓存设备 且是当前设备 且mac地址不为空 3秒以后调用startScanSingle 上传记录当前方法是:_connect',
|
||||
// detail:
|
||||
// '_connect deviceName:$deviceName scanSingleTimer调用startScanSingle',
|
||||
// upload: false);
|
||||
// startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) => null);
|
||||
// });ƒ
|
||||
} else if (isAddEquipment == false && isExistDevice == false) {
|
||||
// 取消缓存直接使用,存在配对场景设备信息会更变
|
||||
BuglyTool.uploadException(
|
||||
message: '取消缓存直接使用,存在配对场景设备信息会更变 然后开始指定设备名称的扫描蓝牙设备 上传记录当前方法是:_connect',
|
||||
detail: '符合条件(isAddEquipment == false && isExistDevice == false) 下一步调用startScanSingle',
|
||||
upload: false
|
||||
);
|
||||
message:
|
||||
'取消缓存直接使用,存在配对场景设备信息会更变 然后开始指定设备名称的扫描蓝牙设备 上传记录当前方法是:_connect',
|
||||
detail:
|
||||
'符合条件(isAddEquipment == false && isExistDevice == false) 下一步调用startScanSingle',
|
||||
upload: false);
|
||||
|
||||
// AppLog.log('无存在设备需要扫描 deviceName:$deviceName isAddEquipment:$isAddEquipment');
|
||||
startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) {
|
||||
@ -406,9 +442,9 @@ class BlueManage {
|
||||
} else {
|
||||
BuglyTool.uploadException(
|
||||
message: '没有扫描直接调用连接设备 上传记录当前方法是:_connect',
|
||||
detail: '走这个方法是有缓存或者添加设备的时候以及不符合(GetPlatform.isAndroid && !isExistDevice && isCurrentDevice && mac != null) deviceName:$deviceName 直接调用_connectDevice',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'走这个方法是有缓存或者添加设备的时候以及不符合(GetPlatform.isAndroid && !isExistDevice && isCurrentDevice && mac != null) deviceName:$deviceName 直接调用_connectDevice',
|
||||
upload: false);
|
||||
// AppLog.log('安卓或者iOS 存在设备不需要扫描 deviceName:$deviceName isAddEquipment:$isAddEquipment');
|
||||
_connectDevice(devicesList, deviceName, connectStateCallBack,
|
||||
isAddEquipment: isAddEquipment);
|
||||
@ -417,18 +453,19 @@ class BlueManage {
|
||||
|
||||
//查找缓存里面是否有设备
|
||||
bool isExistScanDevices(String connectDeviceName) {
|
||||
final bool isExistDevice = scanDevices.any((ScanResult element) => element.device.platformName == connectDeviceName || element.advertisementData.advName == connectDeviceName);
|
||||
final bool isExistDevice = scanDevices.any((ScanResult element) =>
|
||||
element.device.platformName == connectDeviceName ||
|
||||
element.advertisementData.advName == connectDeviceName);
|
||||
return isExistDevice;
|
||||
}
|
||||
|
||||
Future<void> _connectDevice(
|
||||
List<ScanResult> devicesList,
|
||||
String deviceName,
|
||||
ConnectStateCallBack connectStateCallBack,
|
||||
{
|
||||
bool isAddEquipment = false, // 是否是添加设备之前
|
||||
bool isReconnect = true, // 是否是重连
|
||||
}) async {
|
||||
ConnectStateCallBack connectStateCallBack, {
|
||||
bool isAddEquipment = false, // 是否是添加设备之前
|
||||
bool isReconnect = true, // 是否是重连
|
||||
}) async {
|
||||
// 判断数组列表里面是否有这个设备
|
||||
// AppLog.log("devicesList:$devicesList");
|
||||
|
||||
@ -453,25 +490,27 @@ class BlueManage {
|
||||
}
|
||||
if (scanResult == null || connectDeviceMacAddress.isEmpty) {
|
||||
BuglyTool.uploadException(
|
||||
message: '扫描结果scanResult == null || connectDeviceMacAddress.isEmpty不往下执行 return 上传记录当前方法是:_connectDevice',
|
||||
detail: 'scanResult:$scanResult connectDeviceMacAddress:$connectDeviceMacAddress',
|
||||
upload: false
|
||||
);
|
||||
message:
|
||||
'扫描结果scanResult == null || connectDeviceMacAddress.isEmpty不往下执行 return 上传记录当前方法是:_connectDevice',
|
||||
detail:
|
||||
'scanResult:$scanResult connectDeviceMacAddress:$connectDeviceMacAddress',
|
||||
upload: false);
|
||||
return;
|
||||
}
|
||||
AppLog.log('调用了停止扫描的方法');
|
||||
await stopScan();
|
||||
|
||||
if ((scanResult.advertisementData.serviceUuids[0].toString()[31] == '0') && isAddEquipment == false) {
|
||||
if ((scanResult.advertisementData.serviceUuids[0].toString()[31] == '0') &&
|
||||
isAddEquipment == false) {
|
||||
// 添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接
|
||||
if (isReconnect == true) {
|
||||
AppLog.log('该锁已被重置, 重新发送扫描命令');
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '该锁已被重置, 重新发送扫描命令startScanSingle 上传记录当前方法是:_connectDevice',
|
||||
detail: '添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接 该锁已被重置, 重新发送扫描命令 serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接 该锁已被重置, 重新发送扫描命令 serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}',
|
||||
upload: false);
|
||||
|
||||
scanDevices.clear();
|
||||
startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) {
|
||||
@ -485,18 +524,18 @@ class BlueManage {
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '提示该锁已被重置, 回调断开连接, 清除缓存,上传记录当前方法是:_connectDevice',
|
||||
detail: 'isReconnect:$isReconnect serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'isReconnect:$isReconnect serviceUuids:${scanResult.advertisementData.serviceUuids[0].toString()}',
|
||||
upload: false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '从devicesList里面查到了设备 下一步连接设备 上传记录当前方法是:_connectDevice',
|
||||
detail: 'devicesList:$devicesList scanResult:${scanResult.toString()} bluetoothConnectDevice:${bluetoothConnectDevice.toString()} connectDeviceMacAddress:$connectDeviceMacAddress',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'devicesList:$devicesList scanResult:${scanResult.toString()} bluetoothConnectDevice:${bluetoothConnectDevice.toString()} connectDeviceMacAddress:$connectDeviceMacAddress',
|
||||
upload: false);
|
||||
|
||||
//连接设备
|
||||
await bluetoothDeviceConnect(bluetoothConnectDevice!, connectStateCallBack);
|
||||
@ -516,14 +555,13 @@ class BlueManage {
|
||||
BuglyTool.uploadException(
|
||||
message: '直接给蓝牙设备写入 上传记录当前方法是:doNotSearchBLE',
|
||||
detail: '直接给蓝牙设备写入 通过fromId方法创建一个BluetoothDevice masAdds:$masAdds',
|
||||
upload: false
|
||||
);
|
||||
}else{
|
||||
upload: false);
|
||||
} else {
|
||||
BuglyTool.uploadException(
|
||||
message: '直接给蓝牙设备写入 上传记录当前方法是:doNotSearchBLE',
|
||||
detail: '直接给蓝牙设备写入 用传入的bluetoothConnectDevice:${bluetoothConnectDevice.toString()}连接 masAdds:$masAdds',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'直接给蓝牙设备写入 用传入的bluetoothConnectDevice:${bluetoothConnectDevice.toString()}连接 masAdds:$masAdds',
|
||||
upload: false);
|
||||
}
|
||||
//尝试连接设备
|
||||
await bluetoothDeviceConnect(bluetoothConnectDevice!, connectStateCallBack,
|
||||
@ -554,54 +592,60 @@ class BlueManage {
|
||||
AppLog.log('$maxAttempts次后尝试连接失败');
|
||||
BuglyTool.uploadException(
|
||||
message: '连接三次超时断开连接 回调断开连接 上传记录当前方法是:bluetoothDeviceConnect',
|
||||
detail: 'bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} $maxAttempts次后尝试连接失败',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} $maxAttempts次后尝试连接失败',
|
||||
upload: false);
|
||||
needScanSingle = true;
|
||||
connectStateCallBack(BluetoothConnectionState.disconnected);
|
||||
}
|
||||
|
||||
if (bluetoothConnectionState == BluetoothConnectionState.connected) {
|
||||
try {
|
||||
final List<BluetoothService> services = await bluetoothConnectDevice.discoverServices();
|
||||
needScanSingle = false;
|
||||
final List<BluetoothService> services =
|
||||
await bluetoothConnectDevice.discoverServices();
|
||||
//循环判断服务
|
||||
for (final BluetoothService service in services) {
|
||||
if (service.uuid == _serviceIdConnect) {
|
||||
for (final BluetoothCharacteristic characteristic in service.characteristics) {
|
||||
if (characteristic.characteristicUuid == _characteristicIdSubscription) {
|
||||
for (final BluetoothCharacteristic characteristic
|
||||
in service.characteristics) {
|
||||
if (characteristic.characteristicUuid ==
|
||||
_characteristicIdSubscription) {
|
||||
_subScribeToCharacteristic(characteristic);
|
||||
bluetoothConnectionState = BluetoothConnectionState.connected;
|
||||
connectStateCallBack(bluetoothConnectionState!);
|
||||
BuglyTool.uploadException(
|
||||
message: '订阅成功 上传记录当前方法是:bluetoothDeviceConnect',
|
||||
detail: '发现服务,连接成功,订阅数据 bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} ',
|
||||
upload: false
|
||||
);
|
||||
} else{
|
||||
detail:
|
||||
'发现服务,连接成功,订阅数据 bluetoothDeviceConnect:${bluetoothConnectDevice.toString()} ',
|
||||
upload: false);
|
||||
} else {
|
||||
BuglyTool.uploadException(
|
||||
message: '订阅失败 上传记录当前方法是:bluetoothDeviceConnect',
|
||||
detail: '失败原因: characteristic.characteristicUuid:${characteristic.characteristicUuid} != _characteristicIdSubscription:$_characteristicIdSubscription bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'失败原因: characteristic.characteristicUuid:${characteristic.characteristicUuid} != _characteristicIdSubscription:$_characteristicIdSubscription bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}',
|
||||
upload: false);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
BuglyTool.uploadException(
|
||||
message: '订阅失败 上传记录当前方法是:bluetoothDeviceConnect',
|
||||
detail: '失败原因: service.uuid:${service.uuid} != _serviceIdConnect:$_serviceIdConnect bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'失败原因: service.uuid:${service.uuid} != _serviceIdConnect:$_serviceIdConnect bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}',
|
||||
upload: false);
|
||||
}
|
||||
}
|
||||
} on Exception catch (e) {
|
||||
needScanSingle = true;
|
||||
bluetoothConnectionState = BluetoothConnectionState.disconnected;
|
||||
connectStateCallBack(bluetoothConnectionState!);
|
||||
AppLog.log(
|
||||
'发现设备时失败 e:$e bluetoothConnectionState:$bluetoothConnectionState');
|
||||
BuglyTool.uploadException(
|
||||
message: '发现服务时失败',
|
||||
detail: '发现服务时报错原因e:$e bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}',
|
||||
upload: false
|
||||
);
|
||||
detail:
|
||||
'发现服务时报错原因e:$e bluetoothDeviceConnect:${bluetoothConnectDevice.toString()}',
|
||||
upload: false);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
@ -46,12 +46,11 @@ class GatewayConfiguringWifiCommand extends SenderProtocol {
|
||||
subData = getFixedLengthList(subData, 20 - passwordLength);
|
||||
|
||||
//gatewayConfigurationStr
|
||||
// final int clientIdLength = utf8.encode(gatewayConfigurationStr!).length;
|
||||
// subData.add(clientIdLength);
|
||||
final int clientIdLength = utf8.encode(gatewayConfigurationStr!).length;
|
||||
subData.add(clientIdLength);
|
||||
subData.addAll(utf8.encode(gatewayConfigurationStr!));
|
||||
// subData = getFixedLengthList(subData, 20 - clientIdLength);
|
||||
|
||||
data.add(subData.length);
|
||||
data.addAll(subData);
|
||||
|
||||
printLog(data);
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
// 获取网关状态
|
||||
import 'dart:convert';
|
||||
|
||||
@ -8,7 +7,6 @@ import '../io_tool/io_tool.dart';
|
||||
import '../io_type.dart';
|
||||
|
||||
class GatewayGetStatusCommand extends SenderProtocol {
|
||||
|
||||
GatewayGetStatusCommand({
|
||||
this.lockID,
|
||||
this.userID,
|
||||
@ -45,7 +43,6 @@ class GatewayGetStatusCommand extends SenderProtocol {
|
||||
subData.addAll(utf8.encode(userID!));
|
||||
subData = getFixedLengthList(subData, 20 - passwordLength);
|
||||
|
||||
data.add(subData.length);
|
||||
data.addAll(subData);
|
||||
|
||||
printLog(data);
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
// import 'package:crypto/crypto.dart' as crypto;
|
||||
@ -10,14 +9,12 @@ import '../io_tool/io_tool.dart';
|
||||
import '../io_type.dart';
|
||||
|
||||
class GatewayGetWifiCommand extends SenderProtocol {
|
||||
|
||||
GatewayGetWifiCommand({
|
||||
this.userID,
|
||||
}) : super(CommandType.gatewayGetWifiList);
|
||||
|
||||
String? userID;
|
||||
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'SenderGetWifiCommand{userID: $userID}';
|
||||
@ -36,14 +33,12 @@ class GatewayGetWifiCommand extends SenderProtocol {
|
||||
data.add(type1);
|
||||
data.add(type2);
|
||||
|
||||
|
||||
//userID 20
|
||||
final int userIDLength = utf8.encode(userID!).length;
|
||||
subData.addAll(utf8.encode(userID!));
|
||||
subData = getFixedLengthList(subData, 20 - userIDLength);
|
||||
AppLog.log('ebcData: $subData');
|
||||
|
||||
data.add(subData.length);
|
||||
data.addAll(subData);
|
||||
|
||||
printLog(data);
|
||||
@ -61,7 +56,8 @@ class GatewayGetWifiReply extends Reply {
|
||||
}
|
||||
|
||||
class GatewayGetWifiListReply extends Reply {
|
||||
GatewayGetWifiListReply.parseData(CommandType commandType, List<int> dataDetail)
|
||||
GatewayGetWifiListReply.parseData(
|
||||
CommandType commandType, List<int> dataDetail)
|
||||
: super.parseData(commandType, dataDetail) {
|
||||
data = dataDetail;
|
||||
}
|
||||
@ -10,8 +10,8 @@ import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_editUser.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_gateway_configuringWifi.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_gateway/io_gateway_configuringWifi.dart';
|
||||
import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
|
||||
@ -33,7 +33,7 @@ import 'io_protocol/io_addUser.dart';
|
||||
import 'io_protocol/io_checkingCardStatus.dart';
|
||||
import 'io_protocol/io_checkingUserInfoCount.dart';
|
||||
import 'io_protocol/io_configuringWifi.dart';
|
||||
import 'io_protocol/io_gateway_getStatus.dart';
|
||||
import 'io_gateway/io_gateway_getStatus.dart';
|
||||
import 'io_protocol/io_getPrivateKey.dart';
|
||||
import 'io_protocol/io_getPublicKey.dart';
|
||||
import 'io_protocol/io_getStarLockStatusInfo.dart';
|
||||
@ -110,7 +110,8 @@ class CommandReciverManager {
|
||||
// 获取的加密数组
|
||||
final List<int> getDataList = data.sublist(12, 12 + dataLen);
|
||||
|
||||
final List<String>? res = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<String>? res =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList = changeStringListToIntList(res!);
|
||||
|
||||
// 解密
|
||||
@ -245,7 +246,8 @@ class CommandReciverManager {
|
||||
break;
|
||||
case CommandType.updataLockRemoteControlList:
|
||||
{
|
||||
reply = UpdataLockRemoteControlListReply.parseData(commandType, data);
|
||||
reply =
|
||||
UpdataLockRemoteControlListReply.parseData(commandType, data);
|
||||
}
|
||||
break;
|
||||
case CommandType.updataLockSet:
|
||||
@ -260,7 +262,8 @@ class CommandReciverManager {
|
||||
break;
|
||||
case CommandType.gatewayConfiguringWifiResult:
|
||||
{
|
||||
reply = GatewayConfiguringWifiResultReply.parseData(commandType, data);
|
||||
reply =
|
||||
GatewayConfiguringWifiResultReply.parseData(commandType, data);
|
||||
}
|
||||
break;
|
||||
case CommandType.gatewayGetWifiList:
|
||||
@ -313,8 +316,8 @@ class CommandReciverManager {
|
||||
case 19:
|
||||
{
|
||||
// 重置开锁密码
|
||||
reply = SenderResetPasswordsReply.parseData(
|
||||
commandType, data);
|
||||
reply =
|
||||
SenderResetPasswordsReply.parseData(commandType, data);
|
||||
}
|
||||
break;
|
||||
case 20:
|
||||
@ -347,8 +350,8 @@ class CommandReciverManager {
|
||||
case 26:
|
||||
{
|
||||
// 注册遥控开始
|
||||
reply = SenderAddRemoteControlWithTimeCycleCoercionReply.parseData(
|
||||
commandType, data);
|
||||
reply = SenderAddRemoteControlWithTimeCycleCoercionReply
|
||||
.parseData(commandType, data);
|
||||
}
|
||||
break;
|
||||
case 27:
|
||||
|
||||
@ -3,7 +3,7 @@ import 'package:star_lock/blue/io_protocol/io_addFace.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_gateway/io_gateway_getWifiList.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
|
||||
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
|
||||
@ -25,8 +25,8 @@ import 'io_protocol/io_checkingUserInfoCount.dart';
|
||||
import 'io_protocol/io_configuringWifi.dart';
|
||||
import 'io_protocol/io_editUser.dart';
|
||||
import 'io_protocol/io_factoryDataReset.dart';
|
||||
import 'io_protocol/io_gateway_configuringWifi.dart';
|
||||
import 'io_protocol/io_gateway_getStatus.dart';
|
||||
import 'io_gateway/io_gateway_configuringWifi.dart';
|
||||
import 'io_gateway/io_gateway_getStatus.dart';
|
||||
import 'io_protocol/io_getPrivateKey.dart';
|
||||
import 'io_protocol/io_getPublicKey.dart';
|
||||
import 'io_protocol/io_getStarLockStatusInfo.dart';
|
||||
|
||||
@ -107,9 +107,9 @@ class F {
|
||||
static String get apiPrefix {
|
||||
switch (appFlavor) {
|
||||
case Flavor.local:
|
||||
// return 'https://ge.lock.star-lock.cn'; // 葛工
|
||||
// return 'http://192.168.1.15:8022'; // 谢工
|
||||
return 'http://zhou.lock.star-lock.cn'; // 周工
|
||||
return 'http://lock.ge.star-lock.cn'; // 葛工
|
||||
// return 'http://192.168.1.15:8022'; // 谢工
|
||||
// return 'http://zhou.lock.star-lock.cn'; // 周工
|
||||
|
||||
case Flavor.dev:
|
||||
case Flavor.xhj_dev:
|
||||
@ -133,6 +133,9 @@ class F {
|
||||
static StarLockAMapKey get aMapKey {
|
||||
switch (appFlavor) {
|
||||
case Flavor.local:
|
||||
return const StarLockAMapKey(
|
||||
androidKey: '9388ca47f9674b447a17eff82bc0e2ea',
|
||||
iosKey: 'cdec0512564baa58be26b2e2ac5ef3b7');
|
||||
case Flavor.dev:
|
||||
return const StarLockAMapKey(
|
||||
androidKey: 'b56b681ee89f4db43a5aa1879ae8cbfe',
|
||||
@ -141,16 +144,39 @@ class F {
|
||||
return const StarLockAMapKey(
|
||||
androidKey: '11d49b3f4fc09c04a02bbb7500925ba2',
|
||||
iosKey: '883a3355d2d77c2fdc2667030dc97ffe');
|
||||
case Flavor.sky_dev:
|
||||
return const StarLockAMapKey(
|
||||
androidKey: '',
|
||||
iosKey: '',
|
||||
);
|
||||
case Flavor.sky_pre:
|
||||
return const StarLockAMapKey(
|
||||
androidKey: '7d59c7416c455af3cf80bfb02478e733',
|
||||
iosKey: 'a5c6c62386aa2b8285b5f8c2cd0597df',
|
||||
);
|
||||
case Flavor.sky:
|
||||
return const StarLockAMapKey(
|
||||
androidKey: 'fb0d2a3e4208b36452cf636aa025a24f',
|
||||
iosKey: '86ca725a12a629c280e116a317aaba19');
|
||||
case Flavor.xhj_dev:
|
||||
return const StarLockAMapKey(
|
||||
androidKey: '',
|
||||
iosKey: '',
|
||||
);
|
||||
case Flavor.xhj_pre:
|
||||
return const StarLockAMapKey(
|
||||
androidKey: '9d96095a53f46f5e323a5e9e7f3eaae2',
|
||||
iosKey: '57f81124738270472558c685199c9a6a',
|
||||
);
|
||||
case Flavor.xhj:
|
||||
return const StarLockAMapKey(
|
||||
androidKey: '9dd8073a2e96870b206269bb562a887a',
|
||||
iosKey: 'c70047e60ce704d945ea89d6c2763b82');
|
||||
default:
|
||||
throw Exception('flavor[$name] aMapKey not found');
|
||||
return const StarLockAMapKey(
|
||||
androidKey: 'no valied key',
|
||||
iosKey: 'no valied key',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -6,9 +6,11 @@ import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_state.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||||
import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../network/api_repository.dart';
|
||||
import '../../tools/baseGetXController.dart';
|
||||
import '../../tools/dateTool.dart';
|
||||
import '../../tools/regularExpression.dart';
|
||||
import '../../tools/showTipView.dart';
|
||||
import '../register/entity/checkIP_entity.dart';
|
||||
@ -53,8 +55,20 @@ class StarLockForgetPasswordLogic extends BaseGetXController {
|
||||
'B748F838-94EE-4BDB-A0E6-7B2D16849792',
|
||||
state.verificationCode.value);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
UmengCommonSdk.onEvent('resetPassword_result', {
|
||||
'account':state.phoneStr.value,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'resetPassword_res':'成功',
|
||||
});
|
||||
|
||||
showToast('重置成功'.tr);
|
||||
Get.back();
|
||||
}else{
|
||||
UmengCommonSdk.onEvent('resetPassword_result', {
|
||||
'account':state.phoneStr.value,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'resetPassword_res':'${entity.errorCode}--${entity.errorMsg}',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
@ -8,10 +7,12 @@ import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||||
import 'package:star_lock/mine/mine/starLockMine_state.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../main/lockMian/lockMain/lockMain_logic.dart';
|
||||
import '../../mine/mine/starLockMine_logic.dart';
|
||||
import '../../network/api_repository.dart';
|
||||
import '../../tools/dateTool.dart';
|
||||
import '../../tools/eventBusEventManage.dart';
|
||||
import '../../tools/showTipView.dart';
|
||||
import '../../tools/storage.dart';
|
||||
@ -49,6 +50,12 @@ class StarLockLoginLogic extends BaseGetXController {
|
||||
username: state.emailOrPhone.value,
|
||||
deviceInfo: state.deviceInfoMap);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
UmengCommonSdk.onEvent('login_result', {
|
||||
'account': state.emailOrPhone.value,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'login_res': '成功',
|
||||
});
|
||||
|
||||
Storage.saveLoginData(entity.data);
|
||||
Storage.setBool(saveIsVip, entity.data!.isVip == 1);
|
||||
eventBus.fire(MineInfoChangeRefreshUI());
|
||||
@ -57,6 +64,12 @@ class StarLockLoginLogic extends BaseGetXController {
|
||||
}
|
||||
Get.offNamedUntil(Routers.starLockMain, (Route route) => false);
|
||||
BlueManage().scanDevices.clear(); //清除设备缓存
|
||||
} else {
|
||||
UmengCommonSdk.onEvent('login_result', {
|
||||
'account': state.emailOrPhone.value,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'login_res': '${entity.errorCode}--${entity.errorMsg}',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ class StarLockLoginState {
|
||||
RxBool agree = false.obs;
|
||||
|
||||
RxString countryCode = '86'.obs;
|
||||
RxString countryName = '中国'.obs;
|
||||
RxString countryName = '中国'.tr.obs;
|
||||
|
||||
RxString emailOrPhone = ''.obs;
|
||||
RxString pwd = ''.obs;
|
||||
|
||||
@ -12,9 +12,11 @@ import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart';
|
||||
import 'package:star_lock/tools/eventBusEventManage.dart';
|
||||
import 'package:star_lock/tools/push/xs_jPhush.dart';
|
||||
import 'package:star_lock/tools/storage.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../network/api_repository.dart';
|
||||
import '../../tools/baseGetXController.dart';
|
||||
import '../../tools/dateTool.dart';
|
||||
import '../../tools/regularExpression.dart';
|
||||
import '../../tools/showTipView.dart';
|
||||
import 'entity/checkIP_entity.dart';
|
||||
@ -59,12 +61,24 @@ class StarLockRegisterLogic extends BaseGetXController {
|
||||
verificationCode: state.verificationCode.value,
|
||||
deviceInfo: state.deviceInfoMap.value);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
UmengCommonSdk.onEvent('register_result', {
|
||||
'account':state.phoneOrEmailStr.value,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'register_res':'成功',
|
||||
});
|
||||
|
||||
Storage.saveLoginData(entity.data);
|
||||
Storage.setBool(saveIsVip, entity.data!.isVip == 1);
|
||||
eventBus.fire(MineInfoChangeRefreshUI());
|
||||
XSJPushProvider().initLocalNotification(isCancelLocalPush: false);
|
||||
Get.offNamedUntil(Routers.starLockMain, (Route route) => false);
|
||||
BlueManage().scanDevices.clear(); //清除设备缓存
|
||||
}else{
|
||||
UmengCommonSdk.onEvent('register_result', {
|
||||
'account':state.phoneOrEmailStr.value,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'register_res':'${entity.errorCode}--${entity.errorMsg}',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:azlistview/azlistview.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -17,7 +16,8 @@ class SelectCountryRegionPage extends StatefulWidget {
|
||||
const SelectCountryRegionPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SelectCountryRegionPage> createState() => _SelectCountryRegionPageState();
|
||||
State<SelectCountryRegionPage> createState() =>
|
||||
_SelectCountryRegionPageState();
|
||||
}
|
||||
|
||||
class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
|
||||
@ -29,18 +29,20 @@ class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
SuspensionUtil.setShowSuspensionStatus(countriesList.cast<ISuspensionBean>());
|
||||
SuspensionUtil.setShowSuspensionStatus(
|
||||
countriesList.cast<ISuspensionBean>());
|
||||
Future.delayed(const Duration(milliseconds: 20), getCountriesListRequest);
|
||||
}
|
||||
|
||||
//请求国家/地区json文件
|
||||
Future<void> getCountriesListRequest() async {
|
||||
final CountryRegionEntity entity = await ApiRepository.to.getCountryRegion('1');
|
||||
final CountryRegionEntity entity =
|
||||
await ApiRepository.to.getCountryRegion('1');
|
||||
countriesList.clear();
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
countriesList.addAll(entity.dataList!);
|
||||
for(final CountryRegionModel model in countriesList){
|
||||
if(model.name! == '中国'){
|
||||
for (final CountryRegionModel model in countriesList) {
|
||||
if (model.code! == '86') {
|
||||
topCountriesList.add(model);
|
||||
break;
|
||||
}
|
||||
@ -77,15 +79,14 @@ class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
FocusScope.of(context).unfocus();
|
||||
},
|
||||
child: Scaffold(
|
||||
resizeToAvoidBottomInset: false,
|
||||
backgroundColor: const Color(0xFFFFFFFF),
|
||||
appBar: TitleAppBar(
|
||||
barTitle:
|
||||
'选择国家/地区'.tr,
|
||||
barTitle: '选择国家/地区'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor,
|
||||
),
|
||||
@ -95,38 +96,43 @@ class _SelectCountryRegionPageState extends State<SelectCountryRegionPage> {
|
||||
editingController: searchController,
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
onSubmittedAction: () {
|
||||
if(searchController.text.isEmpty){
|
||||
if (searchController.text.isEmpty) {
|
||||
getCountriesListRequest();
|
||||
}else{
|
||||
final List<CountryRegionModel> searchList = <CountryRegionModel>[];
|
||||
for (int i = 0, length = countriesList.length; i < length; i++) {
|
||||
} else {
|
||||
final List<CountryRegionModel> searchList =
|
||||
<CountryRegionModel>[];
|
||||
for (int i = 0, length = countriesList.length;
|
||||
i < length;
|
||||
i++) {
|
||||
final CountryRegionModel countryModel = countriesList[i];
|
||||
if(countryModel.name!.contains(searchController.text) || countryModel.code!.contains(searchController.text)){
|
||||
if (countryModel.name!.contains(searchController.text) ||
|
||||
countryModel.code!.contains(searchController.text)) {
|
||||
searchList.add(countryModel);
|
||||
}
|
||||
}
|
||||
countriesList= searchList;
|
||||
countriesList = searchList;
|
||||
_handleList(searchList);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
SizedBox(height:20.h),
|
||||
SizedBox(height: 20.h),
|
||||
Visibility(
|
||||
visible: searchController.text.isEmpty,
|
||||
child: Utils.getSusItem(context, '★')
|
||||
),
|
||||
if (countriesList.isNotEmpty) Visibility(
|
||||
visible: searchController.text.isEmpty,
|
||||
child: Utils.getListItem(context, topCountriesList[0], () {
|
||||
final CountryRegionModel model = topCountriesList[0];
|
||||
final Map<String, dynamic> resultMap = {};
|
||||
resultMap['code'] = model.code ?? '';
|
||||
resultMap['countryId'] = model.countryId.toString() ?? '';
|
||||
resultMap['countryName'] = model.name ?? '' ;
|
||||
Navigator.pop(context, resultMap);
|
||||
})
|
||||
) else Container(),
|
||||
child: Utils.getSusItem(context, '★')),
|
||||
if (countriesList.isNotEmpty)
|
||||
Visibility(
|
||||
visible: searchController.text.isEmpty,
|
||||
child: Utils.getListItem(context, topCountriesList[0], () {
|
||||
final CountryRegionModel model = topCountriesList[0];
|
||||
final Map<String, dynamic> resultMap = {};
|
||||
resultMap['code'] = model.code ?? '';
|
||||
resultMap['countryId'] = model.countryId.toString() ?? '';
|
||||
resultMap['countryName'] = model.name ?? '';
|
||||
Navigator.pop(context, resultMap);
|
||||
}))
|
||||
else
|
||||
Container(),
|
||||
Expanded(
|
||||
child: AzListView(
|
||||
data: countriesList,
|
||||
|
||||
@ -18,6 +18,7 @@ import 'package:star_lock/tools/platform_info_services.dart';
|
||||
import 'package:star_lock/tools/push/xs_jPhush.dart';
|
||||
import 'package:star_lock/tools/storage.dart';
|
||||
import 'package:star_lock/translations/trans_lib.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import 'app.dart';
|
||||
import 'app_settings/app_settings.dart';
|
||||
@ -75,6 +76,9 @@ Future<void> _setCommonServices() async {
|
||||
|
||||
//关于隐私协议的初始化
|
||||
Future<void> privacySDKInitialization() async {
|
||||
UmengCommonSdk.initCommon('671244cf80464b33f6df9648', '671244ae80464b33f6df9646', 'Product');
|
||||
UmengCommonSdk.setPageCollectionModeManual();
|
||||
|
||||
await Get.putAsync(() => PlatformInfoService().init());
|
||||
await BuglyTool.init();
|
||||
// 初始化JPush服务
|
||||
|
||||
@ -13,6 +13,7 @@ import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction
|
||||
import 'package:star_lock/tools/NativeInteractionTool.dart';
|
||||
import 'package:star_lock/tools/dateTool.dart';
|
||||
import 'package:star_lock/tools/showCupertinoAlertView.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../../../blue/blue_manage.dart';
|
||||
import '../../../../blue/io_protocol/io_transferPermissions.dart';
|
||||
@ -34,86 +35,84 @@ class AuthorizedAdminLogic extends BaseGetXController {
|
||||
int? keyId;
|
||||
|
||||
// 监听设备返回的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
|
||||
void _initReplySubscription() {
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
|
||||
// 转移权限
|
||||
if (reply is TransferPermissionsReply) {
|
||||
final List<int> token = reply.data.sublist(2, 6);
|
||||
final List<String> saveStrList = changeIntListToStringList(token);
|
||||
Storage.setStringList(saveBlueToken, saveStrList);
|
||||
|
||||
final int status = reply.data[6];
|
||||
|
||||
switch (status) {
|
||||
case 0x00:
|
||||
//成功
|
||||
break;
|
||||
case 0x06:
|
||||
//无权限
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? publicKey =
|
||||
await Storage.getStringList(saveBluePublicKey);
|
||||
final List<int> publicKeyDataList =
|
||||
changeStringListToIntList(publicKey!);
|
||||
|
||||
final List<String>? token =
|
||||
await Storage.getStringList(saveBlueToken);
|
||||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
|
||||
IoSenderManage.senderFactoryDataReset(
|
||||
lockID: BlueManage().connectDeviceName,
|
||||
userID: await Storage.getUid(),
|
||||
keyID: '1',
|
||||
needAuthor: 1,
|
||||
publicKey: publicKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
// late StreamSubscription<Reply> _replySubscription;
|
||||
// void _initReplySubscription() {
|
||||
// _replySubscription =
|
||||
// EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
|
||||
// // 转移权限
|
||||
// if (reply is TransferPermissionsReply) {
|
||||
// final List<int> token = reply.data.sublist(2, 6);
|
||||
// final List<String> saveStrList = changeIntListToStringList(token);
|
||||
// Storage.setStringList(saveBlueToken, saveStrList);
|
||||
//
|
||||
// final int status = reply.data[6];
|
||||
// switch (status) {
|
||||
// case 0x00:
|
||||
// //成功
|
||||
// break;
|
||||
// case 0x06:
|
||||
// //无权限
|
||||
// final List<String>? privateKey =
|
||||
// await Storage.getStringList(saveBluePrivateKey);
|
||||
// final List<int> getPrivateKeyList =
|
||||
// changeStringListToIntList(privateKey!);
|
||||
//
|
||||
// final List<String>? publicKey =
|
||||
// await Storage.getStringList(saveBluePublicKey);
|
||||
// final List<int> publicKeyDataList =
|
||||
// changeStringListToIntList(publicKey!);
|
||||
//
|
||||
// final List<String>? token =
|
||||
// await Storage.getStringList(saveBlueToken);
|
||||
// final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
//
|
||||
// IoSenderManage.senderFactoryDataReset(
|
||||
// lockID: BlueManage().connectDeviceName,
|
||||
// userID: await Storage.getUid(),
|
||||
// keyID: '1',
|
||||
// needAuthor: 1,
|
||||
// publicKey: publicKeyDataList,
|
||||
// privateKey: getPrivateKeyList,
|
||||
// token: getTokenList);
|
||||
// break;
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
// 转移权限
|
||||
Future<void> transferPermissionsAction() async {
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
(BluetoothConnectionState state) async {
|
||||
if (state == BluetoothConnectionState.connected) {
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? publicKey =
|
||||
await Storage.getStringList(saveBluePublicKey);
|
||||
final List<int> publicKeyDataList =
|
||||
changeStringListToIntList(publicKey!);
|
||||
|
||||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
|
||||
IoSenderManage.senderTransferPermissions(
|
||||
lockID: BlueManage().connectDeviceName,
|
||||
authUserID: await Storage.getUid(),
|
||||
keyID: '1',
|
||||
oldUserID: await Storage.getUid(),
|
||||
newUserID: '100002',
|
||||
needAuthor: 1,
|
||||
publicKey: publicKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList);
|
||||
}
|
||||
});
|
||||
}
|
||||
// Future<void> transferPermissionsAction() async {
|
||||
// BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
// (BluetoothConnectionState state) async {
|
||||
// if (state == BluetoothConnectionState.connected) {
|
||||
// final List<String>? privateKey =
|
||||
// await Storage.getStringList(saveBluePrivateKey);
|
||||
// final List<int> getPrivateKeyList =
|
||||
// changeStringListToIntList(privateKey!);
|
||||
//
|
||||
// final List<String>? publicKey =
|
||||
// await Storage.getStringList(saveBluePublicKey);
|
||||
// final List<int> publicKeyDataList =
|
||||
// changeStringListToIntList(publicKey!);
|
||||
//
|
||||
// final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||
// final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
//
|
||||
// IoSenderManage.senderTransferPermissions(
|
||||
// lockID: BlueManage().connectDeviceName,
|
||||
// authUserID: await Storage.getUid(),
|
||||
// keyID: '1',
|
||||
// oldUserID: await Storage.getUid(),
|
||||
// newUserID: '100002',
|
||||
// needAuthor: 1,
|
||||
// publicKey: publicKeyDataList,
|
||||
// privateKey: getPrivateKeyList,
|
||||
// token: getTokenList);
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
//发送授权管理员列表请求
|
||||
Future<void> sendElectronicKeyRequest() async {
|
||||
@ -223,7 +222,15 @@ class AuthorizedAdminLogic extends BaseGetXController {
|
||||
idCardNumber: state.isRequireAuth.value == true
|
||||
? state.idCardController.text
|
||||
: '');
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
UmengCommonSdk.onEvent('add_authorizedAdmin', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_password_result':'添加授权管理员成功',
|
||||
});
|
||||
|
||||
state.createUser.value = 0;
|
||||
state.isSendSuccess.value = true;
|
||||
state.addUserId.value = entity.data!.receiverUser!.id.toString();
|
||||
@ -238,6 +245,13 @@ class AuthorizedAdminLogic extends BaseGetXController {
|
||||
state.createUser.value = 1;
|
||||
sendElectronicKeyRequest();
|
||||
});
|
||||
}else{
|
||||
UmengCommonSdk.onEvent('add_authorizedAdmin', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_password_result':'添加授权管理员失败:${entity.errorMsg}',
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -328,11 +342,11 @@ class AuthorizedAdminLogic extends BaseGetXController {
|
||||
void onReady() {
|
||||
super.onReady();
|
||||
|
||||
_initReplySubscription();
|
||||
// _initReplySubscription();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
_replySubscription.cancel();
|
||||
// _replySubscription.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
|
||||
import 'package:expandable/expandable.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
@ -19,6 +20,7 @@ import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/NativeInteractionTool.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
import 'authorizedAdmin_logic.dart';
|
||||
@ -136,12 +138,15 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
}
|
||||
},
|
||||
),
|
||||
CommonItem(
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(
|
||||
false, '请输入姓名'.tr, 2)),
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.keyNameController),
|
||||
// CommonItem(
|
||||
// leftTitel: '姓名'.tr,
|
||||
// rightTitle: '',
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: getTFWidget(false, '请输入姓名'.tr, 2)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
@ -191,18 +196,19 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
Widget keyOnlyManageWidget() {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
CommonItem(
|
||||
leftTitel: '仅管理自己创建的用户'.tr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
isTipsImg: true,
|
||||
tipsImgAction: () {
|
||||
ShowTipView().showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr);
|
||||
},
|
||||
rightWidget: SizedBox(
|
||||
width: 60.w,
|
||||
height: 50.h,
|
||||
child: _onlyManageYouCreatesUserSwitch())),
|
||||
// CommonItem(
|
||||
// leftTitel: '仅管理自己创建的用户'.tr,
|
||||
// rightTitle: '',
|
||||
// isHaveRightWidget: true,
|
||||
// isTipsImg: true,
|
||||
// tipsImgAction: () {
|
||||
// ShowTipView().showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr);
|
||||
// },
|
||||
// rightWidget: SizedBox(
|
||||
// width: 60.w,
|
||||
// height: 50.h,
|
||||
// child: _onlyManageYouCreatesUserSwitch())),
|
||||
onlyManageSelf('仅管理自己创建的用户'.tr),
|
||||
Container(height: 10.h),
|
||||
keyRealNameWidget(),
|
||||
Container(height: 10.h),
|
||||
@ -210,6 +216,67 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
);
|
||||
}
|
||||
|
||||
Widget onlyManageSelf(String leftTitel) {
|
||||
return Container(
|
||||
// height: 65.h,
|
||||
width: 1.sw,
|
||||
padding: EdgeInsets.only(left: 20.w, right: 5.w, top: 10.h, bottom: 10.h),
|
||||
color: Colors.white,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
SizedBox(
|
||||
width: 1.sw - 150.w,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Text(leftTitel ?? '',
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(fontSize: 22.sp)),
|
||||
),
|
||||
SizedBox(width: 5.w),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
ShowTipView()
|
||||
.showSureAlertDialog('授权管理员只能查看和管理自己下发的钥匙、密码等权限'.tr);
|
||||
},
|
||||
child: Container(
|
||||
width: 50.h,
|
||||
height: 50.h,
|
||||
// color: Colors.red,
|
||||
padding:
|
||||
EdgeInsets.only(right: 10.h, top: 15.h, bottom: 10.h),
|
||||
child: Image.asset(
|
||||
'images/icon_tips_Q.png',
|
||||
width: 20.w,
|
||||
height: 20.w,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// SizedBox(width: 6.w),
|
||||
// Spacer(),
|
||||
CupertinoSwitch(
|
||||
activeColor: CupertinoColors.activeBlue,
|
||||
trackColor: CupertinoColors.systemGrey5,
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.onlyManageYouCreatesUser.value,
|
||||
onChanged: (bool value) {
|
||||
setState(() {
|
||||
state.onlyManageYouCreatesUser.value =
|
||||
!state.onlyManageYouCreatesUser.value;
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget keyBottomWidget(String tipStr) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
@ -258,7 +325,8 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
},
|
||||
child: Text(
|
||||
'批量授权锁'.tr,
|
||||
style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
|
||||
style:
|
||||
TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
|
||||
)),
|
||||
],
|
||||
),
|
||||
@ -352,8 +420,9 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
height: 10.h,
|
||||
),
|
||||
OutLineBtn(
|
||||
btnName:
|
||||
state.emailOrPhoneController.text.contains('@') ? '邮件通知'.tr : '短信通知'.tr,
|
||||
btnName: state.emailOrPhoneController.text.contains('@')
|
||||
? '邮件通知'.tr
|
||||
: '短信通知'.tr,
|
||||
onClick: () {
|
||||
Get.toNamed(Routers.sendEmailNotificationPage,
|
||||
arguments: <String, Object?>{
|
||||
@ -483,20 +552,20 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
}
|
||||
|
||||
//仅管理自己创建的用户
|
||||
CupertinoSwitch _onlyManageYouCreatesUserSwitch() {
|
||||
return CupertinoSwitch(
|
||||
activeColor: CupertinoColors.activeBlue,
|
||||
trackColor: CupertinoColors.systemGrey5,
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.onlyManageYouCreatesUser.value,
|
||||
onChanged: (bool value) {
|
||||
setState(() {
|
||||
state.onlyManageYouCreatesUser.value =
|
||||
!state.onlyManageYouCreatesUser.value;
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
// CupertinoSwitch _onlyManageYouCreatesUserSwitch() {
|
||||
// return CupertinoSwitch(
|
||||
// activeColor: CupertinoColors.activeBlue,
|
||||
// trackColor: CupertinoColors.systemGrey5,
|
||||
// thumbColor: CupertinoColors.white,
|
||||
// value: state.onlyManageYouCreatesUser.value,
|
||||
// onChanged: (bool value) {
|
||||
// setState(() {
|
||||
// state.onlyManageYouCreatesUser.value =
|
||||
// !state.onlyManageYouCreatesUser.value;
|
||||
// });
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
|
||||
Future _openModalBottomSheet() async {
|
||||
showModalBottomSheet(
|
||||
@ -644,11 +713,11 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
TabBar _tabBar() {
|
||||
return TabBar(
|
||||
controller: state.tabController,
|
||||
tabs: _itemTabs.map(_tab).toList(),
|
||||
onTap: (int index) {
|
||||
FocusScope.of(context).requestFocus(FocusNode());
|
||||
},
|
||||
isScrollable: true,
|
||||
tabs: _itemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -665,20 +734,19 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: Container(
|
||||
width: 1.sw / 4,
|
||||
margin: EdgeInsets.all(10.w),
|
||||
child: Text(
|
||||
item.title,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
);
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 3) / 2,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
Widget _pageWidget() {
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -15,6 +14,7 @@ import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/dateTool.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
@ -78,10 +78,10 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyBottomWidget()
|
||||
],
|
||||
),
|
||||
@ -93,10 +93,10 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyTimeLimitWidget(),
|
||||
// SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -110,10 +110,10 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyCyclicDate(),
|
||||
SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -126,21 +126,6 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
}
|
||||
}
|
||||
|
||||
// 密码命名输入框
|
||||
Widget perpetualKeyWidget(
|
||||
String titleStr, String rightTitle, TextEditingController controller) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
CommonItem(
|
||||
leftTitel: titleStr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(rightTitle)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// 限时顶部选择日期
|
||||
Widget keyTimeLimitWidget() {
|
||||
return Column(
|
||||
@ -154,7 +139,8 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.parse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
@ -164,10 +150,11 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
rightTitle: state.timeLimitEndTime.value,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
@ -188,14 +175,14 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result =
|
||||
await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -212,7 +199,8 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -232,10 +220,12 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
visible: state.effectiveDateTime.value.isNotEmpty,
|
||||
child: CommonItem(
|
||||
leftTitel: '有效时间'.tr,
|
||||
rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
rightTitle:
|
||||
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -304,59 +294,6 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
);
|
||||
}
|
||||
|
||||
// 接受者信息输入框
|
||||
Widget getTFWidget(String tfStr) {
|
||||
return Container(
|
||||
// color: Colors.red,
|
||||
height: 65.h,
|
||||
width: 300.w,
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: state.nameController,
|
||||
autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: tfStr,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹
|
||||
CupertinoSwitch _isStressFingerprint() {
|
||||
return CupertinoSwitch(
|
||||
@ -402,10 +339,8 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
},
|
||||
tabs: state.fromType.value == 1
|
||||
? _itemTabs.map(_tab).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map(_tab)
|
||||
.toList(),
|
||||
isScrollable: true,
|
||||
: _fromCheckInTypeItemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -422,13 +357,18 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: SizedBox(
|
||||
width: 1.sw / 5,
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 5) / 3,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
@ -437,9 +377,7 @@ class _AddCardPageState extends State<AddCardPage>
|
||||
child: TabBarView(
|
||||
controller: state.tabController,
|
||||
children: state.fromType.value == 1
|
||||
? _itemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList()
|
||||
? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
|
||||
@ -7,6 +7,7 @@ import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/card/addICCard/addICCard_entity.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../../../blue/blue_manage.dart';
|
||||
import '../../../../blue/io_protocol/io_addICCardWithTimeCycleCoercion.dart';
|
||||
@ -15,6 +16,7 @@ import '../../../../blue/io_tool/io_tool.dart';
|
||||
import '../../../../blue/io_tool/manager_event_bus.dart';
|
||||
import '../../../../blue/sender_manage.dart';
|
||||
import '../../../../network/api_repository.dart';
|
||||
import '../../../../tools/bugly/bugly_tool.dart';
|
||||
import '../../../../tools/dateTool.dart';
|
||||
import '../../../../tools/eventBusEventManage.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
@ -41,6 +43,11 @@ class AddICCardLogic extends BaseGetXController{
|
||||
|
||||
Future<void> _replyAddICCardBegin(Reply reply) async {
|
||||
final int status = reply.data[2];
|
||||
BuglyTool.uploadException(
|
||||
message: '添加卡开始,解析数据',
|
||||
detail: '添加卡开始,解析数据 _replyAddICCardBegin:${reply.data}',
|
||||
upload: false
|
||||
);
|
||||
|
||||
switch(status){
|
||||
case 0x00:
|
||||
@ -101,10 +108,24 @@ class AddICCardLogic extends BaseGetXController{
|
||||
Future<void> _replyAddICCardConfirmation(Reply reply) async {
|
||||
final int status = reply.data[2];
|
||||
state.ifAddState.value = false;
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '添加卡结果,解析数据',
|
||||
detail: '添加卡结果,解析数据 _replyAddICCardConfirmation:${reply.data}',
|
||||
eventStr: '添加卡事件结果',
|
||||
upload: true
|
||||
);
|
||||
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
switch(status){
|
||||
case 0x00:
|
||||
//成功
|
||||
//成功
|
||||
UmengCommonSdk.onEvent('add_card', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_card_result':'成功',
|
||||
});
|
||||
switch(reply.data[5]){
|
||||
case 0xff:
|
||||
// 注册指纹失败
|
||||
@ -139,28 +160,69 @@ class AddICCardLogic extends BaseGetXController{
|
||||
break;
|
||||
default:
|
||||
//失败
|
||||
UmengCommonSdk.onEvent('add_card', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_card_result':reply.data[2],
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 添加卡片
|
||||
Future<void> senderAddICCard() async {
|
||||
showBlueConnetctToastTimer(action: (){
|
||||
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
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 String command = SenderAddICCardWithTimeCycleCoercionCommand(
|
||||
keyID:'1',
|
||||
userID:await Storage.getUid(),
|
||||
cardNo:0,
|
||||
useCountLimit:0xffff,
|
||||
operate:0, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin:state.isAdministrator.value == '2' ? 1 : 0,
|
||||
isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫
|
||||
isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环
|
||||
weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环
|
||||
startDate: int.parse(state.startDate.value)~/1000,
|
||||
endDate: int.parse(state.endDate.value)~/1000,
|
||||
startTime:DateTool().dateToHNString(state.effectiveDateTime.value),
|
||||
endTime:DateTool().dateToHNString(state.failureDateTime.value),
|
||||
needAuthor:1,
|
||||
signKey:signKeyDataList,
|
||||
privateKey:getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
).toString();
|
||||
|
||||
showBlueConnetctToastTimer(action: () async {
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('add_card', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_card_result':'添加卡超时',
|
||||
});
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '添加卡超时处理-添加卡失败',
|
||||
detail: '添加卡超时处理,断开连接,添加卡失败--SenderAddICCardWithTimeCycleCoercionCommand:$command',
|
||||
eventStr: '添加卡事件超时',
|
||||
upload: true
|
||||
);
|
||||
|
||||
Get.close(1);
|
||||
});
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
|
||||
if (deviceConnectionState == BluetoothConnectionState.connected){
|
||||
cancelBlueConnetctToastTimer();
|
||||
|
||||
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
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!);
|
||||
|
||||
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
|
||||
keyID:'1',
|
||||
userID:await Storage.getUid(),
|
||||
@ -182,6 +244,21 @@ class AddICCardLogic extends BaseGetXController{
|
||||
isBeforeAddUser: false
|
||||
);
|
||||
} else if (deviceConnectionState == BluetoothConnectionState.disconnected){
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('add_card', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_card_result':'添加卡断开连接',
|
||||
});
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '添加卡超时处理-添加卡失败',
|
||||
detail: '添加卡超时处理,断开连接,添加卡失败--SenderAddICCardWithTimeCycleCoercionCommand:$command',
|
||||
eventStr: '添加卡事件断开连接',
|
||||
upload: true
|
||||
);
|
||||
|
||||
if(state.ifCurrentScreen.value == true){
|
||||
showBlueConnetctToast();
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
@ -131,7 +130,8 @@ class CardListLogic extends BaseGetXController {
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
isBeforeAddUser: false);
|
||||
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
|
||||
} else if (deviceConnectionState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
@ -218,13 +218,13 @@ class CardListLogic extends BaseGetXController {
|
||||
String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4
|
||||
if (fingerprintItemData.cardType! == 1) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久';
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${'永久'.tr}';
|
||||
} else if (fingerprintItemData.cardType! == 2) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}';
|
||||
} else if (fingerprintItemData.cardType! == 4) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}';
|
||||
}
|
||||
return keyDateTypeStr;
|
||||
}
|
||||
|
||||
@ -2,12 +2,16 @@ import 'dart:async';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_state.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart';
|
||||
import 'package:star_lock/tools/commonDataManage.dart';
|
||||
import 'package:star_lock/tools/dateTool.dart';
|
||||
import 'package:star_lock/tools/eventBusEventManage.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../../blue/blue_manage.dart';
|
||||
import '../../../blue/io_protocol/io_referEventRecordTime.dart';
|
||||
@ -17,11 +21,12 @@ import '../../../blue/io_tool/manager_event_bus.dart';
|
||||
import '../../../blue/sender_manage.dart';
|
||||
import '../../../network/api_repository.dart';
|
||||
import '../../../tools/baseGetXController.dart';
|
||||
import '../../../tools/bugly/bugly_tool.dart';
|
||||
import '../../../tools/storage.dart';
|
||||
import '../lockOperatingRecord/keyOperationRecord_entity.dart';
|
||||
|
||||
class DoorLockLogLogic extends BaseGetXController {
|
||||
DoorLockLogState state = DoorLockLogState();
|
||||
final DoorLockLogState state = DoorLockLogState();
|
||||
|
||||
// 获取解析后的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
@ -38,8 +43,16 @@ class DoorLockLogLogic extends BaseGetXController {
|
||||
|
||||
// 根据时间查解析数据
|
||||
Future<void> _replyReferEventRecordTime(Reply reply) async {
|
||||
BuglyTool.uploadException(
|
||||
message: '查询锁记录结果,解析数据',
|
||||
detail: '查询锁记录结果,解析数据:${reply.data}',
|
||||
eventStr: '查询锁记录事件结果',
|
||||
upload: true);
|
||||
|
||||
state.isLockReceiveResponse = true;
|
||||
cancelBlueConnetctToastTimer();
|
||||
final int status = reply.data[2];
|
||||
|
||||
switch (status) {
|
||||
case 0x00:
|
||||
//成功
|
||||
@ -76,8 +89,8 @@ class DoorLockLogLogic extends BaseGetXController {
|
||||
(0xff & indexList[4]) << 16 |
|
||||
(0xff & indexList[5]) << 8 |
|
||||
(0xFF & indexList[6]);
|
||||
final operateDate = time * 1000;
|
||||
final serverTime = state.currentDate;
|
||||
final int operateDate = time * 1000;
|
||||
final int serverTime = state.currentDate;
|
||||
if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter(
|
||||
DateTime.fromMillisecondsSinceEpoch(serverTime * 1000))) {
|
||||
// AppLog.log('operateDate:$operateDate state.currentDate:${state.currentDate}');
|
||||
@ -100,16 +113,62 @@ class DoorLockLogLogic extends BaseGetXController {
|
||||
break;
|
||||
default:
|
||||
//失败
|
||||
dismissEasyLoading();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 查询事件记录(时间查询)
|
||||
Future<void> senderReferEventRecordTime() async {
|
||||
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>? publicKey =
|
||||
await Storage.getStringList(saveBluePublicKey);
|
||||
final List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
|
||||
|
||||
final String command = SenderReferEventRecordTimeCommand(
|
||||
keyID: BlueManage().connectDeviceName,
|
||||
userID: await Storage.getUid(),
|
||||
logsCount: state.logCountPage,
|
||||
// time:DateTime.now().millisecondsSinceEpoch~/1000,
|
||||
time: state.operateDate,
|
||||
currentDate: state.currentDate,
|
||||
token: getTokenList,
|
||||
needAuthor: 1,
|
||||
publicKey: getPublicKeyList,
|
||||
privateKey: getPrivateKeyList,
|
||||
).toString();
|
||||
|
||||
showEasyLoading();
|
||||
showBlueConnetctToastTimer(action: () {
|
||||
dismissEasyLoading();
|
||||
});
|
||||
showBlueConnetctToastTimer(
|
||||
isShowBlueConnetctToast: true,
|
||||
action: () async {
|
||||
cancelBlueConnetctToastTimer();
|
||||
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('check_doorLockLog', {
|
||||
'lockName': state.keyInfos.value.lockName!,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'open_lock_result': '超时',
|
||||
});
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '查询锁记录超时-查询锁记录失败',
|
||||
detail:
|
||||
'添加密码超时,查询锁记录失败--senderReferEventRecordTimeCommand:$command',
|
||||
eventStr: '查询锁记录事件超时',
|
||||
upload: true);
|
||||
if (state.isLockReceiveResponse == false) {
|
||||
dismissEasyLoading();
|
||||
}
|
||||
});
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
(BluetoothConnectionState connectionStateState) async {
|
||||
if (connectionStateState == BluetoothConnectionState.connected) {
|
||||
@ -140,11 +199,26 @@ class DoorLockLogLogic extends BaseGetXController {
|
||||
);
|
||||
} else if (connectionStateState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
showBlueConnetctToast();
|
||||
}
|
||||
cancelBlueConnetctToastTimer();
|
||||
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('check_doorLockLog', {
|
||||
'lockName': state.keyInfos.value.lockName!,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'open_lock_result': '断开连接',
|
||||
});
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '查询锁记录超时-查询锁记录失败',
|
||||
detail:
|
||||
'添加密码超时,查询锁记录失败--senderReferEventRecordTimeCommand:$command',
|
||||
eventStr: '查询锁记录事件断开连接',
|
||||
upload: true);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -174,19 +248,20 @@ class DoorLockLogLogic extends BaseGetXController {
|
||||
|
||||
/// 刷新门锁日志列表
|
||||
StreamSubscription? _getDoorLockLogListRefreshUIEvent;
|
||||
|
||||
void _getDoorLockLogListRefreshUIAction() {
|
||||
_getDoorLockLogListRefreshUIEvent = eventBus
|
||||
.on<DoorLockLogListRefreshUI>()
|
||||
.listen((DoorLockLogListRefreshUI event) {
|
||||
state.currentSelectDate.value = event.getDoorLockLogTime;
|
||||
// 设置startDate为当天的0点
|
||||
|
||||
// 设置startDate为当天的0点
|
||||
state.startDate.value = DateTime(
|
||||
state.currentSelectDate.value.year,
|
||||
state.currentSelectDate.value.month,
|
||||
state.currentSelectDate.value.day)
|
||||
.millisecondsSinceEpoch;
|
||||
// 设置endDate为下一天的0点,然后减去1毫秒
|
||||
|
||||
// 设置endDate为下一天的0点,然后减去1毫秒
|
||||
state.endDate.value = DateTime(
|
||||
state.currentSelectDate.value.year,
|
||||
state.currentSelectDate.value.month,
|
||||
@ -222,12 +297,31 @@ class DoorLockLogLogic extends BaseGetXController {
|
||||
final KeyOperationRecordEntity entity = await ApiRepository.to
|
||||
.lockRecordUploadData(
|
||||
lockId: state.keyInfos.value.lockId.toString(), records: list);
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
if (state.ifHaveNext == true) {
|
||||
showEasyLoading();
|
||||
getLockRecordLastUploadDataTime();
|
||||
} else {
|
||||
UmengCommonSdk.onEvent('check_doorLockLog', {
|
||||
'lockName': state.keyInfos.value.lockName!,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'open_lock_result': '成功',
|
||||
});
|
||||
mockNetworkDataRequest(isRefresh: true);
|
||||
}
|
||||
dismissEasyLoading();
|
||||
} else {
|
||||
UmengCommonSdk.onEvent('check_doorLockLog', {
|
||||
'lockName': state.keyInfos.value.lockName!,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'open_lock_result': '上传数据接口失败',
|
||||
});
|
||||
dismissEasyLoading();
|
||||
}
|
||||
}
|
||||
|
||||
@ -265,9 +359,10 @@ class DoorLockLogLogic extends BaseGetXController {
|
||||
// 获取是否是演示模式 演示模式不获取接口
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
getLockRecordLastUploadDataTime();
|
||||
_initReplySubscription();
|
||||
mockNetworkDataRequest(isRefresh: true);
|
||||
|
||||
// getLockRecordLastUploadDataTime();
|
||||
_initReplySubscription();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
@ -53,7 +52,9 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
),
|
||||
onTap: () {
|
||||
ShowTipView().showSureAlertDialog(
|
||||
'1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。'.tr +'\n' + '2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录'.tr,
|
||||
'1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。'.tr +
|
||||
'\n' +
|
||||
'2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录'.tr,
|
||||
tipTitle: '看不到操作记录,可能原因有'.tr,
|
||||
sureStr: '我知道了'.tr);
|
||||
},
|
||||
@ -88,7 +89,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
body: Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
children: <Widget>[
|
||||
topAdvancedCalendarWidget(),
|
||||
Divider(
|
||||
height: 1,
|
||||
@ -121,14 +122,13 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
}
|
||||
|
||||
void _onMenuItemSelected(String value) {
|
||||
if(value == '读取记录'.tr){
|
||||
if (value == '读取记录'.tr) {
|
||||
logic.mockNetworkDataRequest(isRefresh: true);
|
||||
}else if(value == '清空记录'.tr){
|
||||
ShowCupertinoAlertView().showClearOperationRecordAlert(
|
||||
clearClick: () {
|
||||
logic.clearOperationRecordRequest();
|
||||
});
|
||||
}else if(value == '导出记录'.tr){
|
||||
} else if (value == '清空记录'.tr) {
|
||||
ShowCupertinoAlertView().showClearOperationRecordAlert(clearClick: () {
|
||||
logic.clearOperationRecordRequest();
|
||||
});
|
||||
} else if (value == '导出记录'.tr) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
@ -141,38 +141,38 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// switch (value) {
|
||||
// case "读取记录".tr:
|
||||
// {
|
||||
// logic.mockNetworkDataRequest(isRefresh: true);
|
||||
// }
|
||||
// break;
|
||||
// case '清空记录'.tr:
|
||||
// {
|
||||
// ShowCupertinoAlertView().showClearOperationRecordAlert(
|
||||
// clearClick: () {
|
||||
// logic.clearOperationRecordRequest();
|
||||
// });
|
||||
// }
|
||||
// break;
|
||||
// case '导出记录':
|
||||
// {
|
||||
// showDialog(
|
||||
// context: context,
|
||||
// builder: (BuildContext context) {
|
||||
// return ExportRecordDialog(
|
||||
// onExport: (String filePath) {
|
||||
// Get.toNamed(Routers.exportSuccessPage,
|
||||
// arguments: <String, String>{'filePath': filePath});
|
||||
// },
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
}
|
||||
// switch (value) {
|
||||
// case "读取记录".tr:
|
||||
// {
|
||||
// logic.mockNetworkDataRequest(isRefresh: true);
|
||||
// }
|
||||
// break;
|
||||
// case '清空记录'.tr:
|
||||
// {
|
||||
// ShowCupertinoAlertView().showClearOperationRecordAlert(
|
||||
// clearClick: () {
|
||||
// logic.clearOperationRecordRequest();
|
||||
// });
|
||||
// }
|
||||
// break;
|
||||
// case '导出记录':
|
||||
// {
|
||||
// showDialog(
|
||||
// context: context,
|
||||
// builder: (BuildContext context) {
|
||||
// return ExportRecordDialog(
|
||||
// onExport: (String filePath) {
|
||||
// Get.toNamed(Routers.exportSuccessPage,
|
||||
// arguments: <String, String>{'filePath': filePath});
|
||||
// },
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
//顶部日历小部件
|
||||
Widget topAdvancedCalendarWidget() {
|
||||
@ -198,7 +198,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
disabledColor: Colors.grey,
|
||||
),
|
||||
child: Stack(
|
||||
children: [
|
||||
children: <Widget>[
|
||||
AdvancedCalendar(
|
||||
controller: state.calendarControllerCustom,
|
||||
events: state.events,
|
||||
@ -384,7 +384,9 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
void didPop() {
|
||||
super.didPop();
|
||||
logic.cancelBlueConnetctToastTimer();
|
||||
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
|
||||
if (EasyLoading.isShow) {
|
||||
EasyLoading.dismiss(animation: true);
|
||||
}
|
||||
state.ifCurrentScreen.value = false;
|
||||
}
|
||||
|
||||
|
||||
@ -68,4 +68,5 @@ class DoorLockLogState {
|
||||
bool ifHaveNext = false; // 页码
|
||||
int logCountPage = 10; // 蓝牙记录一页多少个
|
||||
Rx<DateTime> currentSelectDate = DateTime.now().obs;
|
||||
bool isLockReceiveResponse = false; // 是否收到回复
|
||||
}
|
||||
|
||||
@ -17,6 +17,9 @@ import 'package:star_lock/tools/regularExpression.dart';
|
||||
import 'package:star_lock/tools/showCupertinoAlertView.dart';
|
||||
import 'package:star_lock/tools/showTipView.dart';
|
||||
import 'package:star_lock/tools/storage.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../../../../../blue/blue_manage.dart';
|
||||
|
||||
class SendElectronicKeyViewLogic extends BaseGetXController {
|
||||
SendElectronicKeyViewLogic(this.type);
|
||||
@ -180,7 +183,15 @@ class SendElectronicKeyViewLogic extends BaseGetXController {
|
||||
idCardNumber: state.isRequireAuth.value == true
|
||||
? state.idCardController.text
|
||||
: '');
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
UmengCommonSdk.onEvent('add_electronic_key', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_electronic_key_result':'成功',
|
||||
});
|
||||
|
||||
emailOrPhone = state.emailOrPhoneController.text;
|
||||
state.createUser.value = 0;
|
||||
state.isSendSuccess = true;
|
||||
@ -190,6 +201,13 @@ class SendElectronicKeyViewLogic extends BaseGetXController {
|
||||
update();
|
||||
eventBus.fire(ElectronicKeyListRefreshUI());
|
||||
} else {
|
||||
UmengCommonSdk.onEvent('add_electronic_key', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_electronic_key_result':'${entity.errorCode}--${entity.errorMsg}',
|
||||
});
|
||||
|
||||
emailOrPhone = null;
|
||||
if (entity.errorCode == 425) {
|
||||
//用户未注册
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -15,6 +14,7 @@ import '../../../../appRouters.dart';
|
||||
import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
@ -27,7 +27,8 @@ class AddFaceTypePage extends StatefulWidget {
|
||||
State<AddFaceTypePage> createState() => _AddFaceTypePageState();
|
||||
}
|
||||
|
||||
class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProviderStateMixin {
|
||||
class _AddFaceTypePageState extends State<AddFaceTypePage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final AddFaceTypeLogic logic = Get.put(AddFaceTypeLogic());
|
||||
final AddFaceTypeState state = Get.find<AddFaceTypeLogic>().state;
|
||||
|
||||
@ -77,10 +78,10 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyBottomWidget()
|
||||
],
|
||||
),
|
||||
@ -92,10 +93,10 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyTimeLimitWidget(),
|
||||
keyBottomWidget()
|
||||
],
|
||||
@ -108,10 +109,10 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyCyclicDate(),
|
||||
SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -124,22 +125,6 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
}
|
||||
}
|
||||
|
||||
// 密码命名输入框
|
||||
Widget perpetualKeyWidget(
|
||||
String titleStr, String rightTitle, TextEditingController controller) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
// Container(height: 10.h),
|
||||
CommonItem(
|
||||
leftTitel: titleStr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(rightTitle)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// 限时顶部选择日期
|
||||
Widget keyTimeLimitWidget() {
|
||||
return Column(
|
||||
@ -153,7 +138,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.parse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
@ -166,7 +152,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
@ -187,14 +174,14 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result =
|
||||
await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -211,7 +198,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -235,7 +223,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
@ -265,8 +254,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
rightTitle: '',
|
||||
isTipsImg: false,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: SizedBox(
|
||||
width: 60.w, height: 50.h, child: _isAdmin())))),
|
||||
rightWidget:
|
||||
SizedBox(width: 60.w, height: 50.h, child: _isAdmin())))),
|
||||
SizedBox(height: 30.h),
|
||||
SubmitBtn(
|
||||
btnName: '下一步'.tr,
|
||||
@ -287,59 +276,6 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
);
|
||||
}
|
||||
|
||||
// 接受者信息输入框
|
||||
Widget getTFWidget(String tfStr) {
|
||||
return Container(
|
||||
// color: Colors.red,
|
||||
height: 65.h,
|
||||
width: 300.w,
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: state.nameController,
|
||||
autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: tfStr,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(
|
||||
borderSide:
|
||||
BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// 是否为管理员
|
||||
CupertinoSwitch _isAdmin() {
|
||||
return CupertinoSwitch(
|
||||
@ -372,10 +308,8 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
},
|
||||
tabs: state.fromType.value == 1
|
||||
? _itemTabs.map(_tab).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map(_tab)
|
||||
.toList(),
|
||||
isScrollable: true,
|
||||
: _fromCheckInTypeItemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -392,13 +326,18 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: SizedBox(
|
||||
width: 1.sw / 5,
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 5) / 3,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
@ -407,9 +346,7 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
|
||||
child: TabBarView(
|
||||
controller: state.tabController,
|
||||
children: state.fromType.value == 1
|
||||
? _itemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList()
|
||||
? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList()
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
@ -24,9 +23,11 @@ class FaceListLogic extends BaseGetXController {
|
||||
// 获取解析后的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
void _initReplySubscription() {
|
||||
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
// 添加人脸开始(此处用作删除人脸)
|
||||
if ((reply is SenderAddFaceReply) && (state.ifCurrentScreen.value == true)) {
|
||||
if ((reply is SenderAddFaceReply) &&
|
||||
(state.ifCurrentScreen.value == true)) {
|
||||
_replyAddFaceBegin(reply);
|
||||
}
|
||||
|
||||
@ -58,10 +59,13 @@ class FaceListLogic extends BaseGetXController {
|
||||
break;
|
||||
case 0x06:
|
||||
//无权限
|
||||
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
|
||||
final List<String>? signKey =
|
||||
await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
final List<int> token = reply.data.sublist(5, 9);
|
||||
@ -69,25 +73,24 @@ class FaceListLogic extends BaseGetXController {
|
||||
Storage.setStringList(saveBlueToken, saveStrList);
|
||||
|
||||
IoSenderManage.senderAddFaceCommand(
|
||||
keyID:state.deletKeyID,
|
||||
userID:(await Storage.getUid())!,
|
||||
faceNo:state.deletFaceNo,
|
||||
useCountLimit:0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin:0,
|
||||
isForce:0, // 是否是胁迫
|
||||
isRound:0, // 是否是循环
|
||||
weekRound:0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime:'0',
|
||||
endTime:'0',
|
||||
needAuthor:1,
|
||||
signKey:signKeyDataList,
|
||||
privateKey:getPrivateKeyList,
|
||||
token: token,
|
||||
isBeforeAddUser: false
|
||||
);
|
||||
keyID: state.deletKeyID,
|
||||
userID: (await Storage.getUid())!,
|
||||
faceNo: state.deletFaceNo,
|
||||
useCountLimit: 0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin: 0,
|
||||
isForce: 0, // 是否是胁迫
|
||||
isRound: 0, // 是否是循环
|
||||
weekRound: 0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime: '0',
|
||||
endTime: '0',
|
||||
needAuthor: 1,
|
||||
signKey: signKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: token,
|
||||
isBeforeAddUser: false);
|
||||
break;
|
||||
default:
|
||||
//失败
|
||||
@ -257,37 +260,39 @@ class FaceListLogic extends BaseGetXController {
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
(BluetoothConnectionState deviceConnectionState) async {
|
||||
if (deviceConnectionState == BluetoothConnectionState.connected) {
|
||||
|
||||
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
|
||||
final List<String>? signKey =
|
||||
await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||||
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!);
|
||||
|
||||
IoSenderManage.senderAddFaceCommand(
|
||||
keyID:state.deletKeyID,
|
||||
userID:(await Storage.getUid())!,
|
||||
faceNo:state.deletFaceNo,
|
||||
useCountLimit:0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin:0,
|
||||
isForce:0, // 是否是胁迫
|
||||
isRound:0, // 是否是循环
|
||||
weekRound:0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime:'0',
|
||||
endTime:'0',
|
||||
needAuthor:1,
|
||||
signKey:signKeyDataList,
|
||||
privateKey:getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
isBeforeAddUser: false
|
||||
);
|
||||
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
|
||||
keyID: state.deletKeyID,
|
||||
userID: (await Storage.getUid())!,
|
||||
faceNo: state.deletFaceNo,
|
||||
useCountLimit: 0xffff,
|
||||
operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部
|
||||
isAdmin: 0,
|
||||
isForce: 0, // 是否是胁迫
|
||||
isRound: 0, // 是否是循环
|
||||
weekRound: 0, // 周循环
|
||||
startDate: 0x11223344,
|
||||
endDate: 0x11223344,
|
||||
startTime: '0',
|
||||
endTime: '0',
|
||||
needAuthor: 1,
|
||||
signKey: signKeyDataList,
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
isBeforeAddUser: false);
|
||||
} else if (deviceConnectionState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
@ -298,12 +303,14 @@ class FaceListLogic extends BaseGetXController {
|
||||
}
|
||||
|
||||
// 获取人脸列表
|
||||
Future<FingerprintListDataEntity> getFaceListData({required bool isRefresh}) async {
|
||||
Future<FingerprintListDataEntity> getFaceListData(
|
||||
{required bool isRefresh}) async {
|
||||
if (isRefresh) {
|
||||
state.faceItemListData.clear();
|
||||
pageNo = 1;
|
||||
}
|
||||
final FingerprintListDataEntity entity = await ApiRepository.to.getFaceListData(
|
||||
final FingerprintListDataEntity entity =
|
||||
await ApiRepository.to.getFaceListData(
|
||||
lockId: state.lockId.value.toString(),
|
||||
pageNo: pageNo.toString(),
|
||||
pageSize: pageSize.toString(),
|
||||
@ -341,7 +348,7 @@ class FaceListLogic extends BaseGetXController {
|
||||
lockId: state.lockId.value,
|
||||
);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('删除成功'.tr, something: (){
|
||||
showToast('删除成功'.tr, something: () {
|
||||
getFaceListData(isRefresh: true);
|
||||
});
|
||||
}
|
||||
@ -359,34 +366,37 @@ class FaceListLogic extends BaseGetXController {
|
||||
lockId: state.lockId.value,
|
||||
);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('重置成功'.tr, something: (){
|
||||
showToast('重置成功'.tr, something: () {
|
||||
getFaceListData(isRefresh: true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
String getKeyType(FingerprintItemData fingerprintItemData){
|
||||
String getKeyType(FingerprintItemData fingerprintItemData) {
|
||||
// fingerprintStatus 1:正常 2:失效
|
||||
String keyTypeStr = '';//
|
||||
if(fingerprintItemData.status == 1){
|
||||
if(fingerprintItemData.startDate! > DateTime.now().millisecondsSinceEpoch){
|
||||
String keyTypeStr = ''; //
|
||||
if (fingerprintItemData.status == 1) {
|
||||
if (fingerprintItemData.startDate! >
|
||||
DateTime.now().millisecondsSinceEpoch) {
|
||||
keyTypeStr = '未生效'.tr;
|
||||
}
|
||||
|
||||
}else if(fingerprintItemData.status == 2){
|
||||
} else if (fingerprintItemData.status == 2) {
|
||||
keyTypeStr = '已失效'.tr;
|
||||
}
|
||||
return keyTypeStr;
|
||||
}
|
||||
|
||||
String getKeyDateType(FingerprintItemData fingerprintItemData){
|
||||
String keyDateTypeStr = '';// 永久:1;限时2,单次3,循环:4
|
||||
if(fingerprintItemData.faceType! == 1){
|
||||
keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久';
|
||||
}else if(fingerprintItemData.faceType! == 2){
|
||||
keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
|
||||
}else if(fingerprintItemData.faceType! == 4){
|
||||
keyDateTypeStr = '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
|
||||
String getKeyDateType(FingerprintItemData fingerprintItemData) {
|
||||
String keyDateTypeStr = ''; // 永久:1;限时2,单次3,循环:4
|
||||
if (fingerprintItemData.faceType! == 1) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${'永久'.tr}';
|
||||
} else if (fingerprintItemData.faceType! == 2) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}';
|
||||
} else if (fingerprintItemData.faceType! == 4) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}';
|
||||
}
|
||||
return keyDateTypeStr;
|
||||
}
|
||||
@ -394,7 +404,9 @@ class FaceListLogic extends BaseGetXController {
|
||||
// 监听修改完详情之后刷新列表
|
||||
late StreamSubscription _teamEvent;
|
||||
void _initRefreshAction() {
|
||||
_teamEvent = eventBus.on<OtherTypeRefreshListEvent>().listen((OtherTypeRefreshListEvent event) {
|
||||
_teamEvent = eventBus
|
||||
.on<OtherTypeRefreshListEvent>()
|
||||
.listen((OtherTypeRefreshListEvent event) {
|
||||
getFaceListData(isRefresh: true);
|
||||
});
|
||||
}
|
||||
|
||||
@ -3,9 +3,11 @@ import 'dart:async';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/fingerprint/addFingerprint/addFingerprint_entity.dart';
|
||||
import 'package:star_lock/tools/dateTool.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../../../../blue/blue_manage.dart';
|
||||
import '../../../../../blue/io_reply.dart';
|
||||
@ -17,6 +19,7 @@ import '../../../../../tools/baseGetXController.dart';
|
||||
import '../../../../../tools/eventBusEventManage.dart';
|
||||
import '../../../../../tools/storage.dart';
|
||||
import '../../../../blue/io_protocol/io_addFingerprintWithTimeCycleCoercion.dart';
|
||||
import '../../../../tools/bugly/bugly_tool.dart';
|
||||
import 'addFingerprint_state.dart';
|
||||
|
||||
class AddFingerprintLogic extends BaseGetXController {
|
||||
@ -44,8 +47,13 @@ class AddFingerprintLogic extends BaseGetXController {
|
||||
}
|
||||
|
||||
Future<void> _replyAddFingerprintBegin(Reply reply) async {
|
||||
final int status = reply.data[2];
|
||||
BuglyTool.uploadException(
|
||||
message: '添加指纹开始,解析数据',
|
||||
detail: '添加指纹开始,解析数据 _replyAddFingerprintBegin:${reply.data}',
|
||||
upload: false
|
||||
);
|
||||
|
||||
final int status = reply.data[2];
|
||||
switch(status){
|
||||
case 0x00:
|
||||
//成功
|
||||
@ -102,8 +110,12 @@ class AddFingerprintLogic extends BaseGetXController {
|
||||
}
|
||||
|
||||
Future<void> _replyAddFingerprintProcess(Reply reply) async {
|
||||
BuglyTool.uploadException(
|
||||
message: '添加指纹过程,解析数据',
|
||||
detail: '添加指纹过程,解析数据 _replyAddFingerprintProcess:${reply.data}',
|
||||
upload: false
|
||||
);
|
||||
final int status = reply.data[2];
|
||||
|
||||
switch(status){
|
||||
case 0x00:
|
||||
//成功
|
||||
@ -154,13 +166,27 @@ class AddFingerprintLogic extends BaseGetXController {
|
||||
|
||||
Future<void> _replyAddFingerprintConfirmation(Reply reply) async {
|
||||
final int status = reply.data[2];
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
switch(status){
|
||||
case 0x00:
|
||||
//成功
|
||||
// var fingerprintNum = listChangInt(reply.data.sublist(9, 11)).toString();
|
||||
final List<int> fingerprintList = reply.data.sublist(reply.data.length - 2);
|
||||
final String fingerprintNum = listChangInt(fingerprintList).toString();
|
||||
state.regIndex.value++;
|
||||
UmengCommonSdk.onEvent('add_fingerprint', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_fingerprint_result':'成功',
|
||||
});
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '添加指纹确认结果,解析数据',
|
||||
detail: '添加指纹确认结果,解析数据 _replyAddFingerprintConfirmation:${reply.data}',
|
||||
upload: false
|
||||
);
|
||||
|
||||
final List<int> fingerprintList = reply.data.sublist(reply.data.length - 2);
|
||||
final String fingerprintNum = listChangInt(fingerprintList).toString();
|
||||
state.regIndex.value++;
|
||||
if(state.fingerprintNumber.value == fingerprintNum){
|
||||
return;
|
||||
}else{
|
||||
@ -177,6 +203,19 @@ class AddFingerprintLogic extends BaseGetXController {
|
||||
break;
|
||||
default:
|
||||
//失败
|
||||
UmengCommonSdk.onEvent('add_fingerprint', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_fingerprint_result':'失败-${reply.data}',
|
||||
});
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '添加指纹确认结果,解析数据',
|
||||
detail: '添加指纹确认结果蓝牙返回失败结果,解析数据 _replyAddFingerprintConfirmation:${reply.data}',
|
||||
eventStr: '添加指纹事件蓝牙返回失败结果',
|
||||
upload: true
|
||||
);
|
||||
state.ifAddState.value = false;
|
||||
break;
|
||||
}
|
||||
@ -184,7 +223,50 @@ class AddFingerprintLogic extends BaseGetXController {
|
||||
|
||||
// 添加指纹开始
|
||||
Future<void> senderAddFingerprint() async {
|
||||
showBlueConnetctToastTimer(action: (){
|
||||
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
|
||||
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
|
||||
|
||||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
|
||||
final String command = SenderAddFingerprintWithTimeCycleCoercionCommand(
|
||||
keyID:'1',
|
||||
userID:await Storage.getUid(),
|
||||
fingerNo:0,
|
||||
useCountLimit:0xffff,
|
||||
isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫
|
||||
isAdmin: state.isAdministrator.value == '2' ? 1 : 0,
|
||||
operate: 0,
|
||||
isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环
|
||||
weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环
|
||||
startDate: int.parse(state.startDate.value)~/1000,
|
||||
endDate: int.parse(state.endDate.value)~/1000,
|
||||
startTime:DateTool().dateToHNString(state.effectiveDateTime.value),
|
||||
endTime:DateTool().dateToHNString(state.failureDateTime.value),
|
||||
needAuthor:1,
|
||||
signKey:signKeyDataList,
|
||||
privateKey:getPrivateKeyList,
|
||||
token: getTokenList,
|
||||
).toString();
|
||||
|
||||
showBlueConnetctToastTimer(action: () async {
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('add_fingerprint', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_fingerprint_result':'超时',
|
||||
});
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '添加指纹超时处理-添加指纹失败',
|
||||
detail: '添加指纹超时处理,断开连接,添加指纹失败--SenderAddFingerprintWithTimeCycleCoercionCommand:$command',
|
||||
eventStr: '添加指纹事件超时',
|
||||
upload: true
|
||||
);
|
||||
Get.close(1);
|
||||
});
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
|
||||
@ -219,6 +301,21 @@ class AddFingerprintLogic extends BaseGetXController {
|
||||
isBeforeAddUser: false
|
||||
);
|
||||
}else if (deviceConnectionState == BluetoothConnectionState.disconnected){
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('add_fingerprint', {
|
||||
'lock_name':BlueManage().connectDeviceName,
|
||||
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date':DateTool().getNowDateWithType(1),
|
||||
'add_fingerprint_result':'断开',
|
||||
});
|
||||
|
||||
BuglyTool.uploadException(
|
||||
message: '添加指纹断开连接-添加指纹失败',
|
||||
detail: '添加指纹断开连接-添加指纹失败--SenderAddFingerprintWithTimeCycleCoercionCommand:$command',
|
||||
eventStr: '添加指纹事件断开连接',
|
||||
upload: true
|
||||
);
|
||||
|
||||
if(state.ifCurrentScreen.value == true){
|
||||
showBlueConnetctToast();
|
||||
}
|
||||
@ -277,6 +374,20 @@ class AddFingerprintLogic extends BaseGetXController {
|
||||
);
|
||||
if(entity.errorCode!.codeIsSuccessful){
|
||||
updateFingerprintUserNoLoadData(entity.data!.fingerprintId.toString());
|
||||
BuglyTool.uploadException(
|
||||
message: '添加指纹调用接口成功',
|
||||
detail: '添加指纹调用接口成功',
|
||||
eventStr: '添加指纹事件用接口成功',
|
||||
upload: true
|
||||
);
|
||||
}else{
|
||||
updateFingerprintUserNoLoadData(entity.data!.fingerprintId.toString());
|
||||
BuglyTool.uploadException(
|
||||
message: '添加指纹调用接口失败',
|
||||
detail: '添加指纹调用接口添加指纹调用接口失败 - ${entity.errorMsg}',
|
||||
eventStr: '添加指纹事件接口失败',
|
||||
upload: true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@ -15,6 +14,7 @@ import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../tools/CustomUnderlineTabIndicator.dart';
|
||||
import '../../../../tools/commonItem.dart';
|
||||
import '../../../../tools/dateTool.dart';
|
||||
import '../../../../tools/key_name_item.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import '../../../../tools/submitBtn.dart';
|
||||
import '../../../../tools/titleAppBar.dart';
|
||||
@ -27,7 +27,8 @@ class AddFingerprintTypePage extends StatefulWidget {
|
||||
State<AddFingerprintTypePage> createState() => _AddFingerprintTypePageState();
|
||||
}
|
||||
|
||||
class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with SingleTickerProviderStateMixin{
|
||||
class _AddFingerprintTypePageState extends State<AddFingerprintTypePage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final AddFingerprintTypeLogic logic = Get.put(AddFingerprintTypeLogic());
|
||||
final AddFingerprintState state = Get.find<AddFingerprintTypeLogic>().state;
|
||||
|
||||
@ -37,7 +38,9 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
|
||||
state.tabController = TabController(
|
||||
vsync: this,
|
||||
length: state.fromType.value == 1 ? _itemTabs.length : _fromCheckInTypeItemTabs.length,
|
||||
length: state.fromType.value == 1
|
||||
? _itemTabs.length
|
||||
: _fromCheckInTypeItemTabs.length,
|
||||
initialIndex: 0);
|
||||
state.tabController.addListener(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
@ -55,7 +58,7 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle:'添加指纹'.tr,
|
||||
barTitle: '添加指纹'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor),
|
||||
body: Column(
|
||||
@ -76,10 +79,10 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyBottomWidget()
|
||||
],
|
||||
),
|
||||
@ -91,10 +94,10 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyTimeLimitWidget(),
|
||||
keyBottomWidget()
|
||||
],
|
||||
@ -107,10 +110,10 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
perpetualKeyWidget(
|
||||
'姓名'.tr,
|
||||
'请输入'.tr,
|
||||
state.nameController),
|
||||
KeyNameItem(
|
||||
leftTitel: '姓名'.tr,
|
||||
rightTitle: '请输入'.tr,
|
||||
controller: state.nameController),
|
||||
keyCyclicDate(),
|
||||
SizedBox(height: 10.h),
|
||||
keyBottomWidget()
|
||||
@ -123,21 +126,6 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
}
|
||||
}
|
||||
|
||||
// 密码命名输入框
|
||||
Widget perpetualKeyWidget(
|
||||
String titleStr, String rightTitle, TextEditingController controller) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
CommonItem(
|
||||
leftTitel: titleStr,
|
||||
rightTitle: '',
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: getTFWidget(rightTitle)),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// 限时顶部选择日期
|
||||
Widget keyTimeLimitWidget() {
|
||||
return Column(
|
||||
@ -148,24 +136,28 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,selectDate:selectDate, mode: DateMode.YMDHM,
|
||||
onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value = DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitBeginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitBeginTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
})),
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '失效时间'.tr,
|
||||
rightTitle: state.timeLimitEndTime.value,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,selectDate:selectDate, mode: DateMode.YMDHM,
|
||||
onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value = DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
final PDuration selectDate = PDuration.parse(
|
||||
DateTime.tryParse(state.timeLimitEndTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
|
||||
state.timeLimitEndTime.value =
|
||||
DateTool().getYMDHNDateString(p, 1);
|
||||
});
|
||||
})),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
@ -178,17 +170,19 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
children: <Widget>[
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: '有效期'.tr,
|
||||
rightTitle:'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
|
||||
rightTitle:
|
||||
'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -205,13 +199,15 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -224,16 +220,19 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
visible: state.effectiveDateTime.value.isNotEmpty,
|
||||
child: CommonItem(
|
||||
leftTitel: '有效时间'.tr,
|
||||
rightTitle: '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
rightTitle:
|
||||
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
final result = await Get.toNamed(
|
||||
Routers.seletKeyCyclicDatePage,
|
||||
arguments: <String, Object>{
|
||||
'validityValue': state.weekdaysList.value,
|
||||
'starDate': state.cycleBeginTime.value,
|
||||
'endDate': state.cycleEndTime.value,
|
||||
'starTime': state.effectiveDateTime.value,
|
||||
'endTime': state.failureDateTime.value
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
state.weekdaysList.value = result['validityValue'];
|
||||
state.cycleBeginTime.value = result['starDate'];
|
||||
@ -268,13 +267,12 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
width: 60.w, height: 50.h, child: _isStressFingerprint()))),
|
||||
Container(
|
||||
color: Colors.white,
|
||||
padding: EdgeInsets.only(left:20.w, right: 20.w, bottom: 20.h),
|
||||
padding: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 20.h),
|
||||
child: Text(
|
||||
"${"当被胁迫要求强行开锁时,使用胁迫指纹会触发报警,报警信息会推送给管理员,该功能需要锁联网。".tr}\n${"请不要将胁迫指纹用于日常开锁".tr}",
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
)
|
||||
),
|
||||
)),
|
||||
SizedBox(height: 30.h),
|
||||
SubmitBtn(
|
||||
btnName: '下一步'.tr,
|
||||
@ -365,54 +363,6 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
// );
|
||||
// }
|
||||
|
||||
// 接受者信息输入框
|
||||
Widget getTFWidget(String tfStr) {
|
||||
return Container(
|
||||
// color: Colors.red,
|
||||
height: 65.h,
|
||||
width: 300.w,
|
||||
padding: EdgeInsets.only(top: 5.h),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: TextField(
|
||||
//输入框一行
|
||||
maxLines: 1,
|
||||
inputFormatters: <TextInputFormatter>[
|
||||
FilteringTextInputFormatter.deny('\n'),
|
||||
LengthLimitingTextInputFormatter(50),
|
||||
],
|
||||
style: TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor),
|
||||
controller: state.nameController,
|
||||
// autofocus: false,
|
||||
textAlign: TextAlign.end,
|
||||
decoration: InputDecoration(
|
||||
//输入里面输入文字内边距设置
|
||||
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
|
||||
hintText: tfStr,
|
||||
hintStyle: TextStyle(fontSize: 22.sp),
|
||||
focusedBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
|
||||
disabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
|
||||
enabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
|
||||
border: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
// suffixIcon: IconButton(
|
||||
// icon: const Icon(Icons.clear),
|
||||
// onPressed: state.nameController.clear,
|
||||
// ),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//isStressFingerprint false:不是胁迫指纹 ture:胁迫指纹
|
||||
CupertinoSwitch _isStressFingerprint() {
|
||||
return CupertinoSwitch(
|
||||
@ -439,13 +389,13 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
);
|
||||
}
|
||||
|
||||
final List<ItemView> _itemTabs = <ItemView>[
|
||||
final List<ItemView> _itemTabs = <ItemView>[
|
||||
ItemView(title: '永久'.tr, selectType: '0'),
|
||||
ItemView(title: '限时'.tr, selectType: '1'),
|
||||
ItemView(title: '循环'.tr, selectType: '2'),
|
||||
];
|
||||
|
||||
final List<ItemView> _fromCheckInTypeItemTabs = <ItemView>[
|
||||
final List<ItemView> _fromCheckInTypeItemTabs = <ItemView>[
|
||||
ItemView(title: '永久'.tr, selectType: '0'),
|
||||
ItemView(title: '限时'.tr, selectType: '1'),
|
||||
];
|
||||
@ -456,8 +406,10 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
onTap: (int index) {
|
||||
FocusScope.of(context).requestFocus(FocusNode());
|
||||
},
|
||||
tabs: state.fromType.value == 1 ? _itemTabs.map(_tab).toList() : _fromCheckInTypeItemTabs.map(_tab).toList(),
|
||||
isScrollable: true,
|
||||
tabs: state.fromType.value == 1
|
||||
? _itemTabs.map(_tab).toList()
|
||||
: _fromCheckInTypeItemTabs.map(_tab).toList(),
|
||||
isScrollable: false,
|
||||
indicatorColor: Colors.red,
|
||||
unselectedLabelColor: Colors.black,
|
||||
unselectedLabelStyle: TextStyle(
|
||||
@ -474,13 +426,18 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
borderSide: BorderSide(color: AppColors.mainColor, width: 4.w),
|
||||
strokeCap: StrokeCap.round,
|
||||
width: 30.w),
|
||||
labelPadding: EdgeInsets.symmetric(horizontal: 10.w),
|
||||
padding: EdgeInsets.zero, // 去除TabBar两侧的间隙
|
||||
);
|
||||
}
|
||||
|
||||
Tab _tab(ItemView item) {
|
||||
return Tab(
|
||||
child: SizedBox(
|
||||
width: 1.sw / 5,
|
||||
child: Container(
|
||||
// color: Colors.red,
|
||||
width: (1.sw - 10.w * 5) / 3,
|
||||
// width: 1.sw / 4,
|
||||
alignment: Alignment.center,
|
||||
child: Text(item.title, textAlign: TextAlign.center)));
|
||||
}
|
||||
|
||||
@ -488,14 +445,14 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
|
||||
return Expanded(
|
||||
child: TabBarView(
|
||||
controller: state.tabController,
|
||||
children:
|
||||
state.fromType.value == 1
|
||||
children: state.fromType.value == 1
|
||||
? _itemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList()
|
||||
: _fromCheckInTypeItemTabs.map((ItemView item) => Obx(indexChangeWidget)).toList(),
|
||||
: _fromCheckInTypeItemTabs
|
||||
.map((ItemView item) => Obx(indexChangeWidget))
|
||||
.toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ItemView {
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
@ -328,7 +327,8 @@ class FingerprintListLogic extends BaseGetXController {
|
||||
*/
|
||||
|
||||
// 获取指纹列表
|
||||
Future<FingerprintListDataEntity> getFingerprintsListData({required bool isRefresh}) async {
|
||||
Future<FingerprintListDataEntity> getFingerprintsListData(
|
||||
{required bool isRefresh}) async {
|
||||
// 如果是下拉刷新,清空已有数据
|
||||
if (isRefresh) {
|
||||
state.fingerprintItemListData.clear();
|
||||
@ -420,22 +420,21 @@ class FingerprintListLogic extends BaseGetXController {
|
||||
"${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${"永久".tr}";
|
||||
} else if (fingerprintItemData.fingerprintType! == 2) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
|
||||
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} ${'限时'.tr}';
|
||||
} else if (fingerprintItemData.fingerprintType! == 4) {
|
||||
keyDateTypeStr =
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
|
||||
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} ${'循环'.tr}';
|
||||
}
|
||||
return keyDateTypeStr;
|
||||
}
|
||||
|
||||
//刷新单条信息
|
||||
Future<void> refreshIndividualKeys(
|
||||
{required int fingerprintId}) async {
|
||||
Future<void> refreshIndividualKeys({required int fingerprintId}) async {
|
||||
final FingerprintEntity entity =
|
||||
await ApiRepository.to.getFingerprintsData(fingerprintId);
|
||||
await ApiRepository.to.getFingerprintsData(fingerprintId);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
final int index = state.fingerprintItemListData
|
||||
.indexWhere((FingerprintItemData item) => item.fingerprintId == fingerprintId);
|
||||
final int index = state.fingerprintItemListData.indexWhere(
|
||||
(FingerprintItemData item) => item.fingerprintId == fingerprintId);
|
||||
state.fingerprintItemListData.removeAt(index);
|
||||
state.fingerprintItemListData.insert(index, entity.data!);
|
||||
}
|
||||
|
||||
@ -7,12 +7,14 @@ import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart';
|
||||
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
|
||||
import 'package:star_lock/tools/bugly/bugly_tool.dart';
|
||||
import 'package:star_lock/tools/throttler.dart';
|
||||
import 'package:star_lock/widget/permission/permission_dialog.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../../app_settings/app_settings.dart';
|
||||
import '../../../blue/blue_manage.dart';
|
||||
@ -25,6 +27,7 @@ import '../../../blue/sender_manage.dart';
|
||||
import '../../../network/api_repository.dart';
|
||||
import '../../../tools/baseGetXController.dart';
|
||||
import '../../../tools/commonDataManage.dart';
|
||||
import '../../../tools/dateTool.dart';
|
||||
import '../../../tools/eventBusEventManage.dart';
|
||||
import '../../../tools/storage.dart';
|
||||
import '../lockOperatingRecord/keyOperationRecord_entity.dart';
|
||||
@ -66,6 +69,17 @@ class LockDetailLogic extends BaseGetXController {
|
||||
detail: '开锁结果,解析数据 _replyOpenLock:${reply.data}',
|
||||
upload: true);
|
||||
|
||||
if (status != 6) {
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('open_lock', {
|
||||
'lock_name': state.keyInfos.value.lockName!,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'open_lock_result': '${reply.data}',
|
||||
});
|
||||
}
|
||||
|
||||
switch (status) {
|
||||
case 0x00:
|
||||
//成功
|
||||
@ -362,7 +376,16 @@ class LockDetailLogic extends BaseGetXController {
|
||||
|
||||
showBlueConnetctToastTimer(
|
||||
outTimer: 20,
|
||||
action: () {
|
||||
action: () async {
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('open_lock', {
|
||||
'lock_name': state.keyInfos.value.lockName!,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'open_lock_result': '超时',
|
||||
});
|
||||
|
||||
resetOpenDoorState();
|
||||
blueManageDisconnect();
|
||||
BuglyTool.uploadException(
|
||||
@ -398,6 +421,15 @@ class LockDetailLogic extends BaseGetXController {
|
||||
message: '蓝牙连接失败-开锁失败',
|
||||
detail: '蓝牙连接失败,断开连接, 开锁失败--OpenLockCommand:$command',
|
||||
upload: true);
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('open_lock', {
|
||||
'lock_name': state.keyInfos.value.lockName!,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'open_lock_result': '断开连接',
|
||||
});
|
||||
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
showBlueConnetctToast();
|
||||
}
|
||||
@ -572,6 +604,15 @@ class LockDetailLogic extends BaseGetXController {
|
||||
}
|
||||
}
|
||||
|
||||
// 远程开锁
|
||||
Future<void> remoteOpenLock() async {
|
||||
final LoginEntity entity = await ApiRepository.to
|
||||
.remoteOpenLock(lockId: state.keyInfos.value.lockId.toString());
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('已开锁'.tr);
|
||||
}
|
||||
}
|
||||
|
||||
/// 锁设置里面开启关闭考勤刷新锁详情
|
||||
void initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() {
|
||||
// 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus
|
||||
|
||||
@ -171,6 +171,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
),
|
||||
Visibility(
|
||||
visible: state.iSClosedUnlockSuccessfulPopup.value,
|
||||
// visible: true,
|
||||
child: Container(
|
||||
width: 1.sw,
|
||||
height: 1.sh - ScreenUtil().statusBarHeight * 2,
|
||||
@ -297,6 +298,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
SizedBox(height: 10.h),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
ShowTipView().showSureAlertDialog(
|
||||
@ -359,85 +361,126 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
],
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
if (state.openDoorBtnisUneable.value == true) {
|
||||
logic.functionBlocker.block(isNeedRealNameAuthThenOpenLock);
|
||||
}
|
||||
},
|
||||
onLongPressStart: (LongPressStartDetails details) {
|
||||
if (state.openDoorBtnisUneable.value == true) {
|
||||
void callback() {
|
||||
setState(startUnLock);
|
||||
}
|
||||
Container(
|
||||
height: 200.r,
|
||||
child: Stack(
|
||||
children: [
|
||||
Center(
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
if (state.openDoorBtnisUneable.value == true) {
|
||||
logic.functionBlocker
|
||||
.block(isNeedRealNameAuthThenOpenLock);
|
||||
}
|
||||
},
|
||||
onLongPressStart: (LongPressStartDetails details) {
|
||||
if (state.openDoorBtnisUneable.value == true) {
|
||||
void callback() {
|
||||
setState(startUnLock);
|
||||
}
|
||||
|
||||
logic.functionBlocker.block(callback);
|
||||
}
|
||||
},
|
||||
child: Container(
|
||||
width: 200.r,
|
||||
height: 200.r,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(100.w),
|
||||
boxShadow: <BoxShadow>[
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.3),
|
||||
offset: const Offset(0, 0),
|
||||
blurRadius: 15.r,
|
||||
spreadRadius: 0,
|
||||
logic.functionBlocker.block(callback);
|
||||
}
|
||||
},
|
||||
child: Container(
|
||||
width: 200.r,
|
||||
height: 200.r,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(100.w),
|
||||
boxShadow: <BoxShadow>[
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.3),
|
||||
offset: const Offset(0, 0),
|
||||
blurRadius: 15.r,
|
||||
spreadRadius: 0,
|
||||
),
|
||||
]),
|
||||
child: Stack(
|
||||
alignment: AlignmentDirectional.center,
|
||||
children: <Widget>[
|
||||
if (state.openDoorBtnisUneable.value == false)
|
||||
Icon(
|
||||
Icons.bluetooth_searching,
|
||||
size: 78.r,
|
||||
color: AppColors.mainColor.withOpacity(0.6),
|
||||
)
|
||||
else
|
||||
Image.asset(
|
||||
state.isOpenPassageMode.value == 1
|
||||
? 'images/icon_lock_err.png'
|
||||
: 'images/icon_lock_fill.png',
|
||||
width: 68.r,
|
||||
height: 68.r,
|
||||
color: AppColors.mainColor,
|
||||
),
|
||||
if (state.openLockBtnState.value == 1)
|
||||
xhjBuildRotationTransition(
|
||||
width: 168.r,
|
||||
height: 168.r,
|
||||
)
|
||||
else
|
||||
Positioned(
|
||||
child: Image.asset(
|
||||
'images/icon_circle_dotted.png',
|
||||
width: 168.r,
|
||||
height: 168.r,
|
||||
color: state.openDoorBtnisUneable.value == false
|
||||
? AppColors.mainColor.withOpacity(0.6)
|
||||
: state.isOpenPassageMode.value == 1
|
||||
? Colors.red
|
||||
: AppColors.mainColor,
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
]),
|
||||
child: Stack(
|
||||
alignment: AlignmentDirectional.center,
|
||||
children: <Widget>[
|
||||
if (state.openDoorBtnisUneable.value == false)
|
||||
Icon(
|
||||
Icons.bluetooth_searching,
|
||||
size: 78.r,
|
||||
color: AppColors.mainColor.withOpacity(0.6),
|
||||
)
|
||||
else
|
||||
Image.asset(
|
||||
state.isOpenPassageMode.value == 1
|
||||
? 'images/icon_lock_err.png'
|
||||
: 'images/icon_lock_fill.png',
|
||||
width: 68.r,
|
||||
height: 68.r,
|
||||
color: AppColors.mainColor,
|
||||
),
|
||||
if (state.openLockBtnState.value == 1)
|
||||
xhjBuildRotationTransition(
|
||||
width: 168.r,
|
||||
height: 168.r,
|
||||
)
|
||||
else
|
||||
Positioned(
|
||||
child: Image.asset(
|
||||
'images/icon_circle_dotted.png',
|
||||
width: 168.r,
|
||||
height: 168.r,
|
||||
color: state.openDoorBtnisUneable.value == false
|
||||
? AppColors.mainColor.withOpacity(0.6)
|
||||
: state.isOpenPassageMode.value == 1
|
||||
? Colors.red
|
||||
: AppColors.mainColor,
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
right: 90.w,
|
||||
bottom: 1,
|
||||
child: Obx(() => Visibility(
|
||||
visible:
|
||||
state.keyInfos.value.lockSetting!.remoteUnlock == 1,
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
ShowCupertinoAlertView().isToRemoteUnLockAlert(
|
||||
remoteUnlockAction: () {
|
||||
if (state.keyInfos.value.hasGateway != 1) {
|
||||
logic.showToast('附近没有可用网关'.tr);
|
||||
}
|
||||
logic.remoteOpenLock();
|
||||
});
|
||||
},
|
||||
child: Align(
|
||||
alignment: const Alignment(0.6, 1),
|
||||
child: FlavorsImg(
|
||||
child: Image.asset(
|
||||
'images/main/icon_main_remoteUnlocking_xhj.png',
|
||||
width: 50.w,
|
||||
height: 52.w,
|
||||
),
|
||||
)),
|
||||
))),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
// SizedBox(height: 15.h),
|
||||
Expanded(
|
||||
child: Text(
|
||||
'点击开锁,长按闭锁'.tr,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: AppColors.darkGrayTextColor,
|
||||
fontSize: 20.sp,
|
||||
child: Center(
|
||||
child: Text(
|
||||
'点击开锁,长按闭锁'.tr,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: AppColors.darkGrayTextColor,
|
||||
fontSize: 20.sp,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
adminInfoView(center: false, max: false),
|
||||
adminInfoView(center: true, max: false),
|
||||
SizedBox(height: 10.h)
|
||||
],
|
||||
),
|
||||
);
|
||||
@ -530,7 +573,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
bottom: 16.h,
|
||||
right: 15.w,
|
||||
),
|
||||
child: adminInfoView(center: false, add: true),
|
||||
child: adminInfoView(center: false),
|
||||
),
|
||||
),
|
||||
Stack(
|
||||
@ -697,6 +740,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
if (state.keyInfos.value.hasGateway != 1) {
|
||||
logic.showToast('附近没有可用网关'.tr);
|
||||
}
|
||||
logic.remoteOpenLock();
|
||||
});
|
||||
},
|
||||
child: Align(
|
||||
@ -716,17 +760,19 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20.w),
|
||||
child: Center(
|
||||
child: Text(
|
||||
logic.getKeyStatusTextAndShow(),
|
||||
maxLines: 2,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp,
|
||||
color: AppColors.btnDisableColor,
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
@ -745,8 +791,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
);
|
||||
}
|
||||
|
||||
Widget adminInfoView(
|
||||
{bool center = true, bool max = true, bool add = false}) {
|
||||
Widget adminInfoView({bool center = true, bool max = true}) {
|
||||
return Row(
|
||||
mainAxisAlignment:
|
||||
center ? MainAxisAlignment.center : MainAxisAlignment.start,
|
||||
@ -770,7 +815,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
style: TextStyle(
|
||||
fontSize: 20.sp, color: AppColors.darkGrayTextColor),
|
||||
),
|
||||
if (add) SizedBox(width: 20.w) else SizedBox(width: 40.w),
|
||||
SizedBox(width: 40.w),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
@ -794,7 +839,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
? AppColors.mainColor
|
||||
: AppColors.btnDisableColor),
|
||||
),
|
||||
if (add) SizedBox(width: 20.w) else SizedBox(width: 20.w),
|
||||
SizedBox(width: 20.w),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
@ -817,35 +862,6 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
? AppColors.mainColor
|
||||
: AppColors.btnDisableColor),
|
||||
),
|
||||
if (add) ...<Widget>[
|
||||
const Spacer(),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
Get.toNamed(Routers.selectLockTypePage);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
FlavorsImg(
|
||||
child: Image.asset(
|
||||
'images/mine/icon_mine_main_addLock.png',
|
||||
width: 24.w,
|
||||
height: 20.w,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
'添加设备'.tr,
|
||||
style: TextStyle(
|
||||
fontSize: 20.sp,
|
||||
color: AppColors.darkGrayTextColor),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
)
|
||||
],
|
||||
@ -1013,13 +1029,13 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
List<Widget> getNormalWidget() {
|
||||
final List<Widget> showWidgetArr = <Widget>[];
|
||||
// 考勤
|
||||
if (state.isAttendance.value == 1) {
|
||||
showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png',
|
||||
'考勤'.tr, state.bottomBtnisEable.value, () {
|
||||
Get.toNamed(Routers.checkingInListPage,
|
||||
arguments: state.keyInfos.value);
|
||||
}));
|
||||
}
|
||||
// if (state.isAttendance.value == 1) {
|
||||
// showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png',
|
||||
// '考勤'.tr, state.bottomBtnisEable.value, () {
|
||||
// Get.toNamed(Routers.checkingInListPage,
|
||||
// arguments: state.keyInfos.value);
|
||||
// }));
|
||||
// }
|
||||
// 操作记录
|
||||
showWidgetArr.add(bottomItem('images/main/icon_main_operatingRecord.png',
|
||||
'操作记录'.tr, state.bottomBtnisEable.value, () {
|
||||
@ -1047,13 +1063,13 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
List<Widget> getAllWidget() {
|
||||
final List<Widget> showWidgetArr = <Widget>[];
|
||||
// 考勤
|
||||
if (state.isAttendance.value == 1) {
|
||||
showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png',
|
||||
'考勤'.tr, state.bottomBtnisEable.value, () {
|
||||
Get.toNamed(Routers.checkingInListPage,
|
||||
arguments: state.keyInfos.value);
|
||||
}));
|
||||
}
|
||||
// if (state.isAttendance.value == 1) {
|
||||
// showWidgetArr.add(bottomItem('images/main/icon_main_clockingIn.png',
|
||||
// '考勤'.tr, state.bottomBtnisEable.value, () {
|
||||
// Get.toNamed(Routers.checkingInListPage,
|
||||
// arguments: state.keyInfos.value);
|
||||
// }));
|
||||
// }
|
||||
|
||||
// 电子钥匙
|
||||
showWidgetArr.add(bottomItem('images/main/icon_main_electronicKey.png',
|
||||
@ -1348,19 +1364,27 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
child: Stack(
|
||||
children: <Widget>[
|
||||
Image.asset(
|
||||
state.iSOpenLock.value == true
|
||||
? 'images/main/unlocked_bg.png'
|
||||
: 'images/main/locked_bg.png',
|
||||
'images/main/icon_lockDetail_openLock_succeed.png',
|
||||
width: 358.w,
|
||||
height: 348.h,
|
||||
),
|
||||
Positioned(
|
||||
top: 180.h,
|
||||
top: 120.h,
|
||||
width: 358.w,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(state.iSOpenLock.value == true ? '已开锁'.tr : '已闭锁'.tr,
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: AppColors.mainColor,
|
||||
fontSize: 32.sp,
|
||||
fontWeight: FontWeight.w600)),
|
||||
SizedBox(
|
||||
height: 10.h,
|
||||
),
|
||||
Text(
|
||||
lockAlias,
|
||||
style: TextStyle(
|
||||
|
||||
@ -22,129 +22,129 @@ class LockOperatingRecordLogic extends BaseGetXController {
|
||||
LockOperatingRecordState state = LockOperatingRecordState();
|
||||
|
||||
// 获取解析后的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
// late StreamSubscription<Reply> _replySubscription;
|
||||
|
||||
void _initReplySubscription() {
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
if (reply is SenderReferEventRecordTimeReply) {
|
||||
_replyReferEventRecordTime(reply);
|
||||
}
|
||||
});
|
||||
}
|
||||
// void _initReplySubscription() {
|
||||
// _replySubscription =
|
||||
// EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
|
||||
// if (reply is SenderReferEventRecordTimeReply) {
|
||||
// _replyReferEventRecordTime(reply);
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
// 根据时间查解析数据
|
||||
Future<void> _replyReferEventRecordTime(Reply reply) async {
|
||||
cancelBlueConnetctToastTimer();
|
||||
final int status = reply.data[2];
|
||||
switch (status) {
|
||||
case 0x00:
|
||||
//成功
|
||||
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);
|
||||
// 把得到的数据按8位分割成数组 然后塞进一个新的数组里面
|
||||
if (reply.data.length < 17) {
|
||||
return;
|
||||
}
|
||||
final List<List<int>> getList = splitList(reply.data, 17);
|
||||
// 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");
|
||||
final Map indexMap = {};
|
||||
|
||||
indexMap['type'] = indexList[0].toString();
|
||||
|
||||
final int userNo = (indexList[1] * 256) + indexList[2];
|
||||
indexMap['user'] = userNo.toString();
|
||||
// AppLog.log('userNouserNouserNouserNo:$userNo');
|
||||
|
||||
final List<int> passwordData = indexList.sublist(7, 17);
|
||||
final String password = utf8String(passwordData);
|
||||
indexMap['password'] = password.toString();
|
||||
// AppLog.log('passwordpasswordpassword:$password');
|
||||
|
||||
indexMap['success'] = '1';
|
||||
|
||||
final int time = (0xff & indexList[3]) << 24 |
|
||||
(0xff & indexList[4]) << 16 |
|
||||
(0xff & indexList[5]) << 8 |
|
||||
(0xFF & indexList[6]);
|
||||
final operateDate = time * 1000;
|
||||
final serverTime = state.currentDate;
|
||||
if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter(
|
||||
DateTime.fromMillisecondsSinceEpoch(serverTime * 1000))) {
|
||||
continue;
|
||||
}
|
||||
indexMap['date'] = '$operateDate';
|
||||
uploadList.add(indexMap);
|
||||
}
|
||||
if (dataLength == state.logCountPage) {
|
||||
state.ifHaveNext = true;
|
||||
} else {
|
||||
state.ifHaveNext = false;
|
||||
}
|
||||
lockRecordUploadData(uploadList);
|
||||
}
|
||||
break;
|
||||
case 0x06:
|
||||
//无权限 需要鉴权
|
||||
|
||||
break;
|
||||
default:
|
||||
//失败
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Future<void> _replyReferEventRecordTime(Reply reply) async {
|
||||
// cancelBlueConnetctToastTimer();
|
||||
// final int status = reply.data[2];
|
||||
// switch (status) {
|
||||
// case 0x00:
|
||||
// //成功
|
||||
// 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);
|
||||
// // 把得到的数据按8位分割成数组 然后塞进一个新的数组里面
|
||||
// if (reply.data.length < 17) {
|
||||
// return;
|
||||
// }
|
||||
// final List<List<int>> getList = splitList(reply.data, 17);
|
||||
// // 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");
|
||||
// final Map indexMap = {};
|
||||
//
|
||||
// indexMap['type'] = indexList[0].toString();
|
||||
//
|
||||
// final int userNo = (indexList[1] * 256) + indexList[2];
|
||||
// indexMap['user'] = userNo.toString();
|
||||
// AppLog.log('userNouserNouserNouserNo:$userNo');
|
||||
//
|
||||
// final List<int> passwordData = indexList.sublist(7, 17);
|
||||
// final String password = utf8String(passwordData);
|
||||
// indexMap['password'] = password.toString();
|
||||
// AppLog.log('passwordpasswordpassword:$password');
|
||||
//
|
||||
// indexMap['success'] = '1';
|
||||
//
|
||||
// final int time = (0xff & indexList[3]) << 24 |
|
||||
// (0xff & indexList[4]) << 16 |
|
||||
// (0xff & indexList[5]) << 8 |
|
||||
// (0xFF & indexList[6]);
|
||||
// final operateDate = time * 1000;
|
||||
// final serverTime = state.currentDate;
|
||||
// if (DateTime.fromMillisecondsSinceEpoch(operateDate).isAfter(
|
||||
// DateTime.fromMillisecondsSinceEpoch(serverTime*1000))) {
|
||||
// continue;
|
||||
// }
|
||||
// indexMap['date'] = '$operateDate';
|
||||
// uploadList.add(indexMap);
|
||||
// }
|
||||
// if (dataLength == state.logCountPage) {
|
||||
// state.ifHaveNext = true;
|
||||
// } else {
|
||||
// state.ifHaveNext = false;
|
||||
// }
|
||||
// lockRecordUploadData(uploadList);
|
||||
// }
|
||||
// break;
|
||||
// case 0x06:
|
||||
// //无权限 需要鉴权
|
||||
//
|
||||
// break;
|
||||
// default:
|
||||
// //失败
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
|
||||
// 查询事件记录(时间查询)
|
||||
Future<void> senderReferEventRecordTime() async {
|
||||
showEasyLoading();
|
||||
showBlueConnetctToastTimer(action: () {
|
||||
dismissEasyLoading();
|
||||
});
|
||||
BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
(BluetoothConnectionState connectionStateState) async {
|
||||
if (connectionStateState == BluetoothConnectionState.connected) {
|
||||
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>? publicKey =
|
||||
await Storage.getStringList(saveBluePublicKey);
|
||||
final List<int> getPublicKeyList =
|
||||
changeStringListToIntList(publicKey!);
|
||||
|
||||
IoSenderManage.senderReferEventRecordTimeCommand(
|
||||
keyID: BlueManage().connectDeviceName,
|
||||
userID: await Storage.getUid(),
|
||||
logsCount: state.logCountPage,
|
||||
// time:DateTime.now().millisecondsSinceEpoch~/1000,
|
||||
time: state.operateDate,
|
||||
currentDate: state.currentDate,
|
||||
token: getTokenList,
|
||||
needAuthor: 1,
|
||||
publicKey: getPublicKeyList,
|
||||
privateKey: getPrivateKeyList,
|
||||
);
|
||||
} else if (connectionStateState ==
|
||||
BluetoothConnectionState.disconnected) {
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
showBlueConnetctToast();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
// Future<void> senderReferEventRecordTime() async {
|
||||
// showEasyLoading();
|
||||
// showBlueConnetctToastTimer(action: () {
|
||||
// dismissEasyLoading();
|
||||
// });
|
||||
// BlueManage().blueSendData(BlueManage().connectDeviceName,
|
||||
// (BluetoothConnectionState connectionStateState) async {
|
||||
// if (connectionStateState == BluetoothConnectionState.connected) {
|
||||
// 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>? publicKey =
|
||||
// await Storage.getStringList(saveBluePublicKey);
|
||||
// final List<int> getPublicKeyList =
|
||||
// changeStringListToIntList(publicKey!);
|
||||
//
|
||||
// IoSenderManage.senderReferEventRecordTimeCommand(
|
||||
// keyID: BlueManage().connectDeviceName,
|
||||
// userID: await Storage.getUid(),
|
||||
// logsCount: state.logCountPage,
|
||||
// // time:DateTime.now().millisecondsSinceEpoch~/1000,
|
||||
// time: state.operateDate,
|
||||
// currentDate: state.currentDate,
|
||||
// token: getTokenList,
|
||||
// needAuthor: 1,
|
||||
// publicKey: getPublicKeyList,
|
||||
// privateKey: getPrivateKeyList,
|
||||
// );
|
||||
// } else if (connectionStateState ==
|
||||
// BluetoothConnectionState.disconnected) {
|
||||
// dismissEasyLoading();
|
||||
// cancelBlueConnetctToastTimer();
|
||||
// if (state.ifCurrentScreen.value == true) {
|
||||
// showBlueConnetctToast();
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
//请求操作记录列表
|
||||
Future<KeyOperationRecordEntity> mockNetworkDataRequest() async {
|
||||
@ -181,48 +181,48 @@ class LockOperatingRecordLogic extends BaseGetXController {
|
||||
}
|
||||
|
||||
// 查询锁记录最后时间
|
||||
Future<void> getLockRecordLastUploadDataTime() async {
|
||||
final LockOperatingRecordGetLastRecordTimeEntity entity =
|
||||
await ApiRepository.to.getLockRecordLastUploadDataTime(
|
||||
lockId: CommonDataManage().currentKeyInfo.lockId.toString());
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
state.operateDate = entity.data!.operateDate! ~/ 1000;
|
||||
state.currentDate = entity.data!.currentDate! ~/ 1000;
|
||||
senderReferEventRecordTime();
|
||||
}
|
||||
}
|
||||
// Future<void> getLockRecordLastUploadDataTime() async {
|
||||
// final LockOperatingRecordGetLastRecordTimeEntity entity =
|
||||
// await ApiRepository.to.getLockRecordLastUploadDataTime(
|
||||
// lockId: CommonDataManage().currentKeyInfo.lockId.toString());
|
||||
// if (entity.errorCode!.codeIsSuccessful) {
|
||||
// state.operateDate = entity.data!.operateDate! ~/ 1000;
|
||||
// state.currentDate = entity.data!.currentDate! ~/ 1000;
|
||||
// senderReferEventRecordTime();
|
||||
// }
|
||||
// }
|
||||
|
||||
// 操作记录上传
|
||||
Future<void> lockRecordUploadData(List list) async {
|
||||
if (list.isEmpty) {
|
||||
return;
|
||||
}
|
||||
final KeyOperationRecordEntity entity = await ApiRepository.to
|
||||
.lockRecordUploadData(
|
||||
lockId: CommonDataManage().currentKeyInfo.lockId.toString(),
|
||||
records: list);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
if (state.ifHaveNext == true) {
|
||||
getLockRecordLastUploadDataTime();
|
||||
} else {
|
||||
pageNo = 1;
|
||||
mockNetworkDataRequest();
|
||||
}
|
||||
}
|
||||
}
|
||||
// Future<void> lockRecordUploadData(List list) async {
|
||||
// if(list.isEmpty){
|
||||
// return;
|
||||
// }
|
||||
// final KeyOperationRecordEntity entity = await ApiRepository.to
|
||||
// .lockRecordUploadData(
|
||||
// lockId: CommonDataManage().currentKeyInfo.lockId.toString(),
|
||||
// records: list);
|
||||
// if (entity.errorCode!.codeIsSuccessful) {
|
||||
// if (state.ifHaveNext == true) {
|
||||
// getLockRecordLastUploadDataTime();
|
||||
// } else {
|
||||
// pageNo = 1;
|
||||
// mockNetworkDataRequest();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
//清空操作记录
|
||||
Future<void> clearOperationRecordRequest() async {
|
||||
final KeyOperationRecordEntity entity = await ApiRepository.to
|
||||
.clearOperationRecord(
|
||||
CommonDataManage().currentKeyInfo.lockId.toString());
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
showToast('清除数据成功'.tr, something: () {
|
||||
pageNo = 1;
|
||||
mockNetworkDataRequest();
|
||||
});
|
||||
}
|
||||
}
|
||||
// Future<void> clearOperationRecordRequest() async {
|
||||
// final KeyOperationRecordEntity entity = await ApiRepository.to
|
||||
// .clearOperationRecord(
|
||||
// CommonDataManage().currentKeyInfo.lockId.toString());
|
||||
// if (entity.errorCode!.codeIsSuccessful) {
|
||||
// showToast('清除数据成功', something: () {
|
||||
// pageNo = 1;
|
||||
// mockNetworkDataRequest();
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
|
||||
@override
|
||||
Future<void> onReady() async {
|
||||
@ -245,10 +245,10 @@ class LockOperatingRecordLogic extends BaseGetXController {
|
||||
// 获取是否是演示模式 演示模式不获取接口
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
getLockRecordLastUploadDataTime();
|
||||
// getLockRecordLastUploadDataTime();
|
||||
// senderReferEventRecordTime();
|
||||
// senderReferEventRecordNumber();
|
||||
_initReplySubscription();
|
||||
// _initReplySubscription();
|
||||
}
|
||||
}
|
||||
|
||||
@ -259,7 +259,7 @@ class LockOperatingRecordLogic extends BaseGetXController {
|
||||
//获取是否是演示模式 演示模式不获取接口
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
_replySubscription.cancel();
|
||||
// _replySubscription.cancel();
|
||||
// _getDoorLockLogListRefreshUIEvent?.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
@ -19,17 +18,20 @@ class LockOperatingRecordPage extends StatefulWidget {
|
||||
const LockOperatingRecordPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<LockOperatingRecordPage> createState() => _LockOperatingRecordPageState();
|
||||
State<LockOperatingRecordPage> createState() =>
|
||||
_LockOperatingRecordPageState();
|
||||
}
|
||||
|
||||
class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> with RouteAware{
|
||||
class _LockOperatingRecordPageState extends State<LockOperatingRecordPage>
|
||||
with RouteAware {
|
||||
final LockOperatingRecordLogic logic = Get.put(LockOperatingRecordLogic());
|
||||
final LockOperatingRecordState state = Get.find<LockOperatingRecordLogic>().state;
|
||||
final LockOperatingRecordState state =
|
||||
Get.find<LockOperatingRecordLogic>().state;
|
||||
|
||||
Future<void> getHttpData() async {
|
||||
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
|
||||
if (isDemoMode == false) {
|
||||
logic.mockNetworkDataRequest().then((KeyOperationRecordEntity value){
|
||||
logic.mockNetworkDataRequest().then((KeyOperationRecordEntity value) {
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
@ -49,7 +51,9 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> with
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle: state.recordName.value.isNotEmpty? state.recordName.value : '操作记录'.tr,
|
||||
barTitle: state.recordName.value.isNotEmpty
|
||||
? state.recordName.value
|
||||
: '操作记录'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor,
|
||||
// actionsList: [
|
||||
@ -75,15 +79,38 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> with
|
||||
// ],
|
||||
),
|
||||
body: EasyRefreshTool(
|
||||
onRefresh: (){
|
||||
onRefresh: () {
|
||||
logic.pageNo = 1;
|
||||
getHttpData();
|
||||
},
|
||||
onLoad: (){
|
||||
onLoad: () {
|
||||
getHttpData();
|
||||
},
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
// (CommonDataManage().currentKeyInfo.isLockOwner == 1 ||
|
||||
// CommonDataManage().currentKeyInfo.keyRight == 1)
|
||||
// ? Column(
|
||||
// children: [
|
||||
// Container(
|
||||
// padding: EdgeInsets.only(left:20.h, right: 20.h, top: 20.h),
|
||||
// child: Text(
|
||||
// TranslationLoader.lanKeys!.lockOperatingRecordTip!.tr,
|
||||
// textAlign: TextAlign.start,
|
||||
// style: TextStyle(fontSize: 20.sp),
|
||||
// ),
|
||||
// ),
|
||||
// KeySearchWidget(
|
||||
// editingController: state.searchController,
|
||||
// onSubmittedAction: () {
|
||||
// logic.pageNo = 1;
|
||||
// getHttpData();
|
||||
// },
|
||||
// ),
|
||||
// ],
|
||||
// )
|
||||
// : Container(),
|
||||
// SizedBox(height: 10.h),
|
||||
Expanded(child: _buildMainUI()),
|
||||
],
|
||||
),
|
||||
@ -115,7 +142,10 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> with
|
||||
);
|
||||
},
|
||||
)
|
||||
: NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight));
|
||||
: NoData(
|
||||
noDataHeight: 1.sh -
|
||||
ScreenUtil().statusBarHeight -
|
||||
ScreenUtil().bottomBarHeight));
|
||||
}
|
||||
|
||||
String getTypeIcon(int type) {
|
||||
@ -143,7 +173,8 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> with
|
||||
return title;
|
||||
}
|
||||
|
||||
Widget _operatingOneRecordItem(String userAvatarStr, String userNameStr, String unlockDescStr, Function() action) {
|
||||
Widget _operatingOneRecordItem(String userAvatarStr, String userNameStr,
|
||||
String unlockDescStr, Function() action) {
|
||||
return GestureDetector(
|
||||
onTap: action,
|
||||
child: Container(
|
||||
@ -158,23 +189,23 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> with
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Icon(Icons.access_time, size: 35.w),
|
||||
SizedBox(width: 10.w,),
|
||||
SizedBox(
|
||||
width: 10.w,
|
||||
),
|
||||
Text(
|
||||
unlockDescStr,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 24.sp,
|
||||
color: AppColors.darkGrayTextColor),
|
||||
fontSize: 24.sp, color: AppColors.darkGrayTextColor),
|
||||
),
|
||||
SizedBox(width: 10.h),
|
||||
Expanded(
|
||||
child:Container(
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(bottom: 3.w),
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Flexible(
|
||||
child: Text(
|
||||
userNameStr,
|
||||
child: Text(userNameStr,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
@ -299,7 +330,9 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> with
|
||||
void didPop() {
|
||||
super.didPop();
|
||||
logic.cancelBlueConnetctToastTimer();
|
||||
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
|
||||
if (EasyLoading.isShow) {
|
||||
EasyLoading.dismiss(animation: true);
|
||||
}
|
||||
state.ifCurrentScreen.value = false;
|
||||
}
|
||||
|
||||
@ -315,8 +348,9 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> with
|
||||
void didPushNext() {
|
||||
super.didPushNext();
|
||||
logic.cancelBlueConnetctToastTimer();
|
||||
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
|
||||
if (EasyLoading.isShow) {
|
||||
EasyLoading.dismiss(animation: true);
|
||||
}
|
||||
state.ifCurrentScreen.value = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/scheduler.dart';
|
||||
@ -6,6 +5,7 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginEntity.dart';
|
||||
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
|
||||
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
|
||||
|
||||
import '../../../../blue/blue_manage.dart';
|
||||
import '../../../../blue/io_protocol/io_factoryDataReset.dart';
|
||||
@ -19,6 +19,7 @@ import '../../../../blue/sender_manage.dart';
|
||||
import '../../../../network/api_repository.dart';
|
||||
import '../../../../tools/baseGetXController.dart';
|
||||
import '../../../../tools/commonDataManage.dart';
|
||||
import '../../../../tools/dateTool.dart';
|
||||
import '../../../../tools/eventBusEventManage.dart';
|
||||
import '../../../../tools/storage.dart';
|
||||
import 'checkingInInfoData_entity.dart';
|
||||
@ -124,11 +125,15 @@ class LockSetLogic extends BaseGetXController {
|
||||
break;
|
||||
case 0x06:
|
||||
//无权限
|
||||
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
|
||||
final List<String>? privateKey =
|
||||
await Storage.getStringList(saveBluePrivateKey);
|
||||
final List<int> getPrivateKeyList =
|
||||
changeStringListToIntList(privateKey!);
|
||||
|
||||
final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey);
|
||||
final List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
|
||||
final List<String>? publicKey =
|
||||
await Storage.getStringList(saveBluePublicKey);
|
||||
final List<int> publicKeyDataList =
|
||||
changeStringListToIntList(publicKey!);
|
||||
|
||||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||
final List<int> getTokenList = changeStringListToIntList(token!);
|
||||
@ -287,7 +292,17 @@ class LockSetLogic extends BaseGetXController {
|
||||
showEasyLoading();
|
||||
showBlueConnetctToastTimer(
|
||||
isShowBlueConnetctToast: false,
|
||||
action: () {
|
||||
action: () async {
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('delet_lock', {
|
||||
'lock_name': BlueManage().connectDeviceName,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'delet_type': 'lock',
|
||||
'delet_lock_result': '删除锁超时',
|
||||
});
|
||||
|
||||
dismissEasyLoading();
|
||||
showDeletAlertTipDialog();
|
||||
});
|
||||
@ -316,6 +331,16 @@ class LockSetLogic extends BaseGetXController {
|
||||
privateKey: getPrivateKeyList,
|
||||
token: getTokenList);
|
||||
} else if (connectionState == BluetoothConnectionState.disconnected) {
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
UmengCommonSdk.onEvent('delet_lock', {
|
||||
'lock_name': BlueManage().connectDeviceName,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'delet_type': 'lock',
|
||||
'delet_lock_result': '删除锁断开',
|
||||
});
|
||||
|
||||
dismissEasyLoading();
|
||||
cancelBlueConnetctToastTimer();
|
||||
if (state.ifCurrentScreen.value == true) {
|
||||
@ -353,7 +378,7 @@ class LockSetLogic extends BaseGetXController {
|
||||
|
||||
// 设置支持功能(带参数)
|
||||
Future<void> sendBurglarAlarm(int type) async {
|
||||
if(state.sureBtnState.value == 1){
|
||||
if (state.sureBtnState.value == 1) {
|
||||
return;
|
||||
}
|
||||
state.sureBtnState.value = 1;
|
||||
@ -533,10 +558,12 @@ class LockSetLogic extends BaseGetXController {
|
||||
void deleyLockLogicOfRoles() {
|
||||
if (state.lockBasicInfo.value.isLockOwner == 1) {
|
||||
// 超级管理员必须通过连接蓝牙删除q
|
||||
state.showTipView.showIosTipWithContentDialog('删除锁后,所有信息都会一起删除,确定删除锁吗?'.tr, () {
|
||||
state.showTipView
|
||||
.showIosTipWithContentDialog('删除锁后,所有信息都会一起删除,确定删除锁吗?'.tr, () {
|
||||
// 删除锁
|
||||
state.showTipView.resetGetController();
|
||||
state.showTipView.showTFViewAlertDialog(state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
|
||||
state.showTipView.showTFViewAlertDialog(
|
||||
state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
|
||||
});
|
||||
} else if (state.lockBasicInfo.value.keyRight == 1) {
|
||||
// 授权管理员弹框提示
|
||||
@ -568,7 +595,17 @@ class LockSetLogic extends BaseGetXController {
|
||||
final LockListInfoEntity entity = await ApiRepository.to.deletOwnerLockData(
|
||||
lockId: state.lockSetInfoData.value.lockId!,
|
||||
);
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
UmengCommonSdk.onEvent('delet_lock', {
|
||||
'lock_name': BlueManage().connectDeviceName,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'delet_type': 'lock',
|
||||
'delet_lock_result': '成功',
|
||||
});
|
||||
|
||||
BlueManage().connectDeviceMacAddress = '';
|
||||
final bool isOnlyOneData = state.isOnlyOneData.value == true;
|
||||
await Future<dynamic>.delayed(const Duration(milliseconds: 200))
|
||||
@ -578,6 +615,15 @@ class LockSetLogic extends BaseGetXController {
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||
eventBus.fire(RefreshLockListInfoDataEvent());
|
||||
});
|
||||
} else {
|
||||
UmengCommonSdk.onEvent('delet_lock', {
|
||||
'lock_name': BlueManage().connectDeviceName,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'delet_type': 'lock',
|
||||
'delet_lock_result': '${entity.errorCode}--${entity.errorMsg}',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -588,7 +634,17 @@ class LockSetLogic extends BaseGetXController {
|
||||
keyId: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
|
||||
includeUnderlings:
|
||||
state.deleteAdministratorIsHaveAllData.value == true ? 1 : 0);
|
||||
final String getMobile = (await Storage.getMobile())!;
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
UmengCommonSdk.onEvent('delet_lock', {
|
||||
'lock_name': BlueManage().connectDeviceName,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'delet_type': 'key',
|
||||
'delet_lock_result': '成功',
|
||||
});
|
||||
|
||||
BlueManage().connectDeviceMacAddress = '';
|
||||
final bool isOnlyOneData = state.isOnlyOneData.value == true;
|
||||
await Future<dynamic>.delayed(const Duration(milliseconds: 200))
|
||||
@ -598,6 +654,15 @@ class LockSetLogic extends BaseGetXController {
|
||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||
eventBus.fire(RefreshLockListInfoDataEvent());
|
||||
});
|
||||
} else {
|
||||
UmengCommonSdk.onEvent('delet_lock', {
|
||||
'lock_name': BlueManage().connectDeviceName,
|
||||
'account':
|
||||
getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
|
||||
'date': DateTool().getNowDateWithType(1),
|
||||
'delet_type': 'key',
|
||||
'delet_lock_result': '${entity.errorCode}--${entity.errorMsg}',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
@ -27,13 +26,14 @@ class LockSetPage extends StatefulWidget {
|
||||
State<LockSetPage> createState() => _LockSetPageState();
|
||||
}
|
||||
|
||||
class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver, RouteAware {
|
||||
class _LockSetPageState extends State<LockSetPage>
|
||||
with WidgetsBindingObserver, RouteAware {
|
||||
final LockSetLogic logic = Get.put(LockSetLogic());
|
||||
final LockSetState state = Get.find<LockSetLogic>().state;
|
||||
|
||||
Future<void> getHttpData() async {
|
||||
logic.getLockSettingInfoData().then((LockSetInfoEntity value) {
|
||||
if(mounted){
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
}
|
||||
});
|
||||
@ -501,17 +501,17 @@ class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver,
|
||||
// }));
|
||||
// }),
|
||||
// 考勤
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 &&
|
||||
state.lockFeature.value.attendance == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: '考勤'.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: _openCheckInSwitch())),
|
||||
),
|
||||
// Obx(
|
||||
// () => Visibility(
|
||||
// visible: state.lockBasicInfo.value.isLockOwner == 1 &&
|
||||
// state.lockFeature.value.attendance == 1,
|
||||
// child: CommonItem(
|
||||
// leftTitel: '考勤'.tr,
|
||||
// rightTitle: '',
|
||||
// isHaveLine: true,
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: _openCheckInSwitch())),
|
||||
// ),
|
||||
// 开锁提醒
|
||||
Obx(
|
||||
() => Visibility(
|
||||
@ -543,7 +543,7 @@ class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver,
|
||||
() => Visibility(
|
||||
visible: state.lockFeature.value.wifi == 1,
|
||||
child: CommonItem(
|
||||
leftTitel:'WiFi配网'.tr,
|
||||
leftTitel: 'WiFi配网'.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
@ -654,31 +654,31 @@ class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver,
|
||||
}
|
||||
|
||||
// 开启考勤
|
||||
CupertinoSwitch _openCheckInSwitch() {
|
||||
return CupertinoSwitch(
|
||||
activeColor: CupertinoColors.activeBlue,
|
||||
trackColor: CupertinoColors.systemGrey5,
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.isAttendance.value == 1,
|
||||
onChanged: (bool value) {
|
||||
logic.openCheckingInData(
|
||||
(CheckingInInfoDataEntity checkingInInfoDataEntity) {
|
||||
if (checkingInInfoDataEntity.data!.companyId == 0) {
|
||||
// logic.showCupertinoAlertDialog(context);
|
||||
ShowTipView().showIosTipWithContentDialog('创建公司后,考勤功能才能使用'.tr, () {
|
||||
// 删除锁
|
||||
Get.toNamed(Routers.checkInCreatCompanyPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
});
|
||||
} else {
|
||||
logic.setLockSetGeneralSetting();
|
||||
}
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
// CupertinoSwitch _openCheckInSwitch() {
|
||||
// return CupertinoSwitch(
|
||||
// activeColor: CupertinoColors.activeBlue,
|
||||
// trackColor: CupertinoColors.systemGrey5,
|
||||
// thumbColor: CupertinoColors.white,
|
||||
// value: state.isAttendance.value == 1,
|
||||
// onChanged: (bool value) {
|
||||
// logic.openCheckingInData(
|
||||
// (CheckingInInfoDataEntity checkingInInfoDataEntity) {
|
||||
// if (checkingInInfoDataEntity.data!.companyId == 0) {
|
||||
// // logic.showCupertinoAlertDialog(context);
|
||||
// ShowTipView().showIosTipWithContentDialog('创建公司后,考勤功能才能使用'.tr, () {
|
||||
// // 删除锁
|
||||
// Get.toNamed(Routers.checkInCreatCompanyPage,
|
||||
// arguments: <String, LockSetInfoData>{
|
||||
// 'lockSetInfoData': state.lockSetInfoData.value
|
||||
// });
|
||||
// });
|
||||
// } else {
|
||||
// logic.setLockSetGeneralSetting();
|
||||
// }
|
||||
// });
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
|
||||
// 开锁提醒
|
||||
CupertinoSwitch _lockRemindSwitch() {
|
||||
@ -700,11 +700,13 @@ class _LockSetPageState extends State<LockSetPage> with WidgetsBindingObserver,
|
||||
trackColor: CupertinoColors.systemGrey5,
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.isOpenLockNeedOnline.value == 1,
|
||||
onChanged: state.sureBtnState.value == 1 ? null : (bool value) {
|
||||
setState(() {
|
||||
logic.sendBurglarAlarm(55);
|
||||
});
|
||||
},
|
||||
onChanged: state.sureBtnState.value == 1
|
||||
? null
|
||||
: (bool value) {
|
||||
setState(() {
|
||||
logic.sendBurglarAlarm(55);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -23,6 +23,8 @@ class LockMonitoringLogic extends BaseGetXController {
|
||||
state.voiceProcessor = VoiceProcessor.instance;
|
||||
}
|
||||
|
||||
/*
|
||||
旧协议暂时不用
|
||||
/// 收到UDP发送的状态
|
||||
StreamSubscription? _getUDPStatusRefreshUIEvent;
|
||||
|
||||
@ -55,6 +57,7 @@ class LockMonitoringLogic extends BaseGetXController {
|
||||
}
|
||||
});
|
||||
}
|
||||
*/
|
||||
|
||||
//发起接听命令,每隔一秒钟发一次,六秒无应答则失败
|
||||
void initiateUdpAnswerAction() {
|
||||
@ -413,7 +416,7 @@ class LockMonitoringLogic extends BaseGetXController {
|
||||
void onReady() {
|
||||
super.onReady();
|
||||
|
||||
_getUDPStatusRefreshUIAction();
|
||||
// _getUDPStatusRefreshUIAction();
|
||||
|
||||
initRecorder();
|
||||
}
|
||||
@ -427,7 +430,7 @@ class LockMonitoringLogic extends BaseGetXController {
|
||||
void onClose() {
|
||||
CallTalk().finishAVData();
|
||||
stopProcessing();
|
||||
_getUDPStatusRefreshUIEvent!.cancel();
|
||||
// _getUDPStatusRefreshUIEvent!.cancel();
|
||||
state.getTVDataRefreshUIEvent!.cancel();
|
||||
|
||||
if (state.oneMinuteTimeTimer != null) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:ui' as ui;
|
||||
|
||||
@ -11,16 +11,17 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart';
|
||||
import 'package:star_lock/app_settings/app_colors.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/main/lockDetail/monitoring/monitoring/star_chart_logic.dart';
|
||||
import 'package:star_lock/talk/call/callTalk.dart';
|
||||
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
|
||||
import 'package:star_lock/talk/udp/udp_manage.dart';
|
||||
import 'package:star_lock/tools/eventBusEventManage.dart';
|
||||
import 'package:star_lock/tools/showTFView.dart';
|
||||
|
||||
import '../../../../app_settings/app_colors.dart';
|
||||
import '../../../../app_settings/app_settings.dart';
|
||||
import '../../../../login/selectCountryRegion/common/index.dart';
|
||||
import '../../../../tools/showTFView.dart';
|
||||
import 'lockMonitoring_logic.dart';
|
||||
import 'lockMonitoring_state.dart';
|
||||
|
||||
class LockMonitoringPage extends StatefulWidget {
|
||||
const LockMonitoringPage({Key? key}) : super(key: key);
|
||||
@ -30,12 +31,13 @@ class LockMonitoringPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
||||
final LockMonitoringLogic logic = Get.put(LockMonitoringLogic());
|
||||
late final StarChartLogic logic;
|
||||
final LockMonitoringState state = Get.find<LockMonitoringLogic>().state;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
logic = Get.put<StarChartLogic>(StarChartLogic());
|
||||
initAsync();
|
||||
_getTVDataRefreshUIAction();
|
||||
}
|
||||
@ -47,234 +49,210 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return PopScope(
|
||||
canPop: false,
|
||||
child: RepaintBoundary(
|
||||
key: state.globalKey,
|
||||
child: Container(
|
||||
width: 1.sw,
|
||||
height: 1.sh,
|
||||
color: Colors.transparent,
|
||||
child: Stack(
|
||||
children: <Widget>[
|
||||
Image.memory(
|
||||
state.listPhotoData.value,
|
||||
gaplessPlayback: true,
|
||||
width: 1.sw,
|
||||
height: 1.sh,
|
||||
fit: BoxFit.cover, //contain-原比例 none-原始图片
|
||||
filterQuality: FilterQuality.high,
|
||||
errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) {
|
||||
return Container(color: Colors.transparent);
|
||||
},
|
||||
canPop: false,
|
||||
child: RepaintBoundary(
|
||||
key: state.globalKey,
|
||||
child: Container(
|
||||
width: 1.sw,
|
||||
height: 1.sh,
|
||||
color: Colors.transparent,
|
||||
child: Stack(
|
||||
children: <Widget>[
|
||||
Image.memory(
|
||||
state.listPhotoData.value,
|
||||
gaplessPlayback: true,
|
||||
width: 1.sw,
|
||||
height: 1.sh,
|
||||
fit: BoxFit.cover,
|
||||
filterQuality: FilterQuality.high,
|
||||
errorBuilder: (BuildContext context, Object error,
|
||||
StackTrace? stackTrace) {
|
||||
return Container(color: Colors.transparent);
|
||||
},
|
||||
),
|
||||
Positioned(
|
||||
top: ScreenUtil().statusBarHeight + 30.h,
|
||||
width: 1.sw,
|
||||
child: Obx(() {
|
||||
final String sec = (state.oneMinuteTime.value % 60)
|
||||
.toString()
|
||||
.padLeft(2, '0');
|
||||
final String min = (state.oneMinuteTime.value ~/ 60)
|
||||
.toString()
|
||||
.padLeft(2, '0');
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text('$min:$sec',
|
||||
style:
|
||||
TextStyle(fontSize: 26.sp, color: Colors.white)),
|
||||
],
|
||||
);
|
||||
}),
|
||||
),
|
||||
Positioned(
|
||||
bottom: 10.w,
|
||||
child: Container(
|
||||
width: 1.sw - 30.w * 2,
|
||||
margin: EdgeInsets.all(30.w),
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xC83C3F41),
|
||||
borderRadius: BorderRadius.circular(20.h),
|
||||
),
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
SizedBox(height: 20.h),
|
||||
buildTopButtons(),
|
||||
SizedBox(height: 20.h),
|
||||
buildBottomButtons(),
|
||||
SizedBox(height: 20.h),
|
||||
],
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
top: ScreenUtil().statusBarHeight + 30.h,
|
||||
width: 1.sw,
|
||||
child: Obx(() {
|
||||
final String sec = (state.oneMinuteTime.value % 60)
|
||||
.toString()
|
||||
.padLeft(2, '0');
|
||||
final String min = (state.oneMinuteTime.value ~/ 60)
|
||||
.toString()
|
||||
.padLeft(2, '0');
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text('$min:$sec',
|
||||
style: TextStyle(
|
||||
fontSize: 26.sp, color: Colors.white)),
|
||||
]);
|
||||
}),
|
||||
),
|
||||
Positioned(
|
||||
bottom: 10.w,
|
||||
child: Container(
|
||||
width: 1.sw - 30.w * 2,
|
||||
// height: 300.h,
|
||||
margin: EdgeInsets.all(30.w),
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xC83C3F41),
|
||||
borderRadius: BorderRadius.circular(20.h)),
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
SizedBox(height: 20.h),
|
||||
bottomTopBtnWidget(),
|
||||
SizedBox(height: 20.h),
|
||||
bottomBottomBtnWidget(),
|
||||
SizedBox(height: 20.h),
|
||||
],
|
||||
),
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
));
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget bottomTopBtnWidget() {
|
||||
return Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
|
||||
// 打开关闭声音
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
state.isOpenVoice.value = !state.isOpenVoice.value;
|
||||
},
|
||||
child: Container(
|
||||
width: 50.w,
|
||||
height: 50.w,
|
||||
padding: EdgeInsets.all(5.w),
|
||||
child: Obx(() => Image(
|
||||
width: 40.w,
|
||||
height: 40.w,
|
||||
image: state.isOpenVoice.value
|
||||
? const AssetImage(
|
||||
'images/main/icon_lockDetail_monitoringCloseVoice.png')
|
||||
: const AssetImage(
|
||||
'images/main/icon_lockDetail_monitoringOpenVoice.png'))),
|
||||
Widget buildTopButtons() {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
buildIconButton(
|
||||
icon: state.isOpenVoice.value
|
||||
? 'images/main/icon_lockDetail_monitoringCloseVoice.png'
|
||||
: 'images/main/icon_lockDetail_monitoringOpenVoice.png',
|
||||
onTap: () {
|
||||
state.isOpenVoice.value = !state.isOpenVoice.value;
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(width: 60.w),
|
||||
// 截图
|
||||
GestureDetector(
|
||||
onTap: captureAndSavePng,
|
||||
child: Container(
|
||||
width: 50.w,
|
||||
height: 50.w,
|
||||
padding: EdgeInsets.all(5.w),
|
||||
child: Image(
|
||||
width: 40.w,
|
||||
height: 40.w,
|
||||
image: const AssetImage(
|
||||
'images/main/icon_lockDetail_monitoringScreenshot.png')),
|
||||
SizedBox(width: 60.w),
|
||||
buildIconButton(
|
||||
icon: 'images/main/icon_lockDetail_monitoringScreenshot.png',
|
||||
onTap: captureAndSavePng,
|
||||
),
|
||||
),
|
||||
SizedBox(width: 60.w),
|
||||
// 录制
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
// Get.toNamed(Routers.monitoringRealTimeScreenPage);
|
||||
},
|
||||
child: Container(
|
||||
width: 50.w,
|
||||
height: 50.w,
|
||||
padding: EdgeInsets.all(5.w),
|
||||
child: Image(
|
||||
width: 40.w,
|
||||
height: 40.w,
|
||||
image: const AssetImage(
|
||||
'images/main/icon_lockDetail_monitoringScreenRecording.png')),
|
||||
SizedBox(width: 60.w),
|
||||
buildIconButton(
|
||||
icon: 'images/main/icon_lockDetail_monitoringScreenRecording.png',
|
||||
onTap: () {
|
||||
// Get.toNamed(Routers.monitoringRealTimeScreenPage);
|
||||
},
|
||||
),
|
||||
),
|
||||
]);
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget bottomBottomBtnWidget() {
|
||||
return Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[
|
||||
// 接听
|
||||
Obx(() => bottomBtnItemWidget(
|
||||
state.isClickAnswer.value == true
|
||||
? 'images/main/icon_lockDetail_monitoringUnTalkback.png'
|
||||
: getAnswerBtnImg(),
|
||||
state.isClickAnswer.value == true ? '长按说话'.tr : getAnswerBtnName(),
|
||||
Colors.white, () async {
|
||||
if (state.isClickAnswer.value == false) {
|
||||
logic.initiateUdpAnswerAction();
|
||||
state.isClickAnswer.value = true;
|
||||
}
|
||||
}, longPress: () {
|
||||
// 开始长按
|
||||
AppLog.log('onLongPress');
|
||||
state.listAudioData.value = <int>[];
|
||||
if (state.udpStatus.value == 8) {
|
||||
state.udpStatus.value = 9;
|
||||
}
|
||||
// logic.readG711Data();
|
||||
logic.startProcessing();
|
||||
}, longPressUp: () async {
|
||||
// 长按结束
|
||||
AppLog.log('onLongPressUp');
|
||||
if (state.udpStatus.value == 9) {
|
||||
state.udpStatus.value = 8;
|
||||
}
|
||||
Widget buildBottomButtons() {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: <Widget>[
|
||||
buildAnswerButton(),
|
||||
buildIconButton(
|
||||
icon: 'images/main/icon_lockDetail_hangUp.png',
|
||||
label: '挂断'.tr,
|
||||
color: Colors.red,
|
||||
onTap: () async {
|
||||
logic.stopProcessing();
|
||||
})),
|
||||
bottomBtnItemWidget(
|
||||
'images/main/icon_lockDetail_hangUp.png', '挂断'.tr, Colors.red, () async {
|
||||
logic.stopProcessing();
|
||||
CallTalk().finishAVData();
|
||||
// 挂断
|
||||
if (state.isClickHangUp.value == false) {
|
||||
logic.initiateUdpHangUpAction(3);
|
||||
state.isClickHangUp.value = true;
|
||||
}
|
||||
// else {
|
||||
// AppLog.log('点了这里?');
|
||||
// state.isClickHangUp.value = true;
|
||||
// UDPTalkClass().stopLocalAudio();
|
||||
// logic.initiateUdpHangUpAction(4);
|
||||
// }
|
||||
}),
|
||||
bottomBtnItemWidget('images/main/icon_lockDetail_monitoringUnlock.png',
|
||||
'开锁'.tr, AppColors.mainColor, () {
|
||||
if (UDPManage().remoteUnlock == 1) {
|
||||
showDeletPasswordAlertDialog(context);
|
||||
} else {
|
||||
logic.showToast('请在锁设置中开启远程开锁'.tr);
|
||||
}
|
||||
})
|
||||
]);
|
||||
CallTalk().finishAVData();
|
||||
if (!state.isClickHangUp.value) {
|
||||
// logic.initiateUdpHangUpAction(3);
|
||||
logic.initiateHangUpCommand();
|
||||
state.isClickHangUp.value = true;
|
||||
}
|
||||
},
|
||||
),
|
||||
buildIconButton(
|
||||
icon: 'images/main/icon_lockDetail_monitoringUnlock.png',
|
||||
label: '开锁'.tr,
|
||||
color: AppColors.mainColor,
|
||||
onTap: () {
|
||||
if (UDPManage().remoteUnlock == 1) {
|
||||
showDeletPasswordAlertDialog(context);
|
||||
} else {
|
||||
logic.showToast('请在锁设置中开启远程开锁'.tr);
|
||||
}
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
String getAnswerBtnImg() {
|
||||
switch (state.udpStatus.value) {
|
||||
case 8:
|
||||
return 'images/main/icon_lockDetail_monitoringUnTalkback.png';
|
||||
case 9:
|
||||
return 'images/main/icon_lockDetail_monitoringTalkback.png';
|
||||
default:
|
||||
return 'images/main/icon_lockDetail_monitoringAnswerCalls.png';
|
||||
}
|
||||
Widget buildAnswerButton() {
|
||||
return Obx(() {
|
||||
final bool isDuringCall =
|
||||
state.talkStatus.value == TalkStatus.duringCall.index;
|
||||
return buildIconButton(
|
||||
icon: isDuringCall
|
||||
? 'images/main/icon_lockDetail_monitoringUnTalkback.png'
|
||||
: 'images/main/icon_lockDetail_monitoringAnswerCalls.png',
|
||||
label: isDuringCall ? '长按说话'.tr : '接听'.tr,
|
||||
onTap: () async {
|
||||
if (!state.isClickAnswer.value) {
|
||||
logic.initiateAnswerCommand();
|
||||
state.isClickAnswer.value = true;
|
||||
}
|
||||
},
|
||||
onLongPress: () {
|
||||
state.listAudioData.value = <int>[];
|
||||
// if (state.udpStatus.value == 8) {
|
||||
// state.udpStatus.value = 9;
|
||||
// }
|
||||
logic.startProcessing();
|
||||
},
|
||||
onLongPressUp: () {
|
||||
// if (state.udpStatus.value == 9) {
|
||||
// state.udpStatus.value = 8;
|
||||
// }
|
||||
logic.stopProcessing();
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
String getAnswerBtnName() {
|
||||
switch (state.udpStatus.value) {
|
||||
case 8:
|
||||
return '长按说话'.tr;
|
||||
case 9:
|
||||
return '松开发送'.tr;
|
||||
default:
|
||||
return '接听'.tr;
|
||||
}
|
||||
}
|
||||
|
||||
Widget bottomBtnItemWidget(
|
||||
String iconUrl, String name, Color backgroundColor, Function() onClick,
|
||||
{Function()? longPress, Function()? longPressUp}) {
|
||||
Widget buildIconButton({
|
||||
required String icon,
|
||||
String? label,
|
||||
Color color = Colors.white,
|
||||
required Function() onTap,
|
||||
Function()? onLongPress,
|
||||
Function()? onLongPressUp,
|
||||
}) {
|
||||
final double wh = 80.w;
|
||||
return GestureDetector(
|
||||
onTap: onClick,
|
||||
onLongPress: longPress,
|
||||
onLongPressUp: longPressUp,
|
||||
onTap: onTap,
|
||||
onLongPress: onLongPress,
|
||||
onLongPressUp: onLongPressUp,
|
||||
child: SizedBox(
|
||||
height: 140.h,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
width: wh,
|
||||
height: wh,
|
||||
decoration: BoxDecoration(
|
||||
color: backgroundColor,
|
||||
borderRadius: BorderRadius.circular((wh + 10.w * 2) / 2)),
|
||||
padding: EdgeInsets.all(20.w),
|
||||
child: Image.asset(iconUrl, fit: BoxFit.fitWidth),
|
||||
height: 140.h,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
width: wh,
|
||||
height: wh,
|
||||
decoration: BoxDecoration(
|
||||
color: color,
|
||||
borderRadius: BorderRadius.circular((wh + 10.w * 2) / 2),
|
||||
),
|
||||
padding: EdgeInsets.all(20.w),
|
||||
child: Image.asset(icon, fit: BoxFit.fitWidth),
|
||||
),
|
||||
if (label != null) ...[
|
||||
SizedBox(height: 20.w),
|
||||
Expanded(
|
||||
child: Text(name,
|
||||
style: TextStyle(fontSize: 20.sp, color: Colors.white),
|
||||
textAlign: TextAlign.center))
|
||||
child: Text(
|
||||
label,
|
||||
style: TextStyle(fontSize: 20.sp, color: Colors.white),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
],
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -292,23 +270,18 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
||||
FilteringTextInputFormatter.allow(RegExp('[0-9]')),
|
||||
],
|
||||
sureClick: () async {
|
||||
//发送删除锁请求
|
||||
if (state.passwordTF.text.isEmpty) {
|
||||
logic.showToast('请输入开锁密码'.tr);
|
||||
return;
|
||||
}
|
||||
|
||||
// List<int> numbers = state.passwordTF.text.split('').map((char) => int.parse(char)).toList();
|
||||
// 开锁
|
||||
// lockID
|
||||
final List<int> numbers = <int>[];
|
||||
final List<int> lockIDData = utf8.encode(state.passwordTF.text);
|
||||
numbers.addAll(lockIDData);
|
||||
// topBytes = getFixedLengthList(lockIDData, 20 - lockIDData.length);
|
||||
for (int i = 0; i < 6 - lockIDData.length; i++) {
|
||||
numbers.add(0);
|
||||
}
|
||||
logic.udpOpenDoorAction(numbers);
|
||||
//todo: 开门暂未实现
|
||||
// logic.udpOpenDoorAction(numbers);
|
||||
},
|
||||
cancelClick: () {
|
||||
Get.back();
|
||||
@ -318,16 +291,11 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
||||
);
|
||||
}
|
||||
|
||||
//获取麦克风权限
|
||||
Future requestMicrophonePermission() async {
|
||||
Future<void> requestMicrophonePermission() async {
|
||||
await logic.getPermissionStatus().then((bool value) async {
|
||||
if (!value) {
|
||||
return;
|
||||
}
|
||||
|
||||
// state.isSenderAudioData.value = false;
|
||||
// AppLog.log("发送接听了");
|
||||
// 刚进来是接听状态,然后改为长按对讲
|
||||
});
|
||||
}
|
||||
|
||||
@ -348,15 +316,12 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
||||
}
|
||||
final Uint8List pngBytes = byteData.buffer.asUint8List();
|
||||
|
||||
// 获取应用程序的文档目录
|
||||
final Directory directory = await getApplicationDocumentsDirectory();
|
||||
final String imagePath = '${directory.path}/screenshot.png';
|
||||
|
||||
// 将截图保存为文件
|
||||
final File imgFile = File(imagePath);
|
||||
await imgFile.writeAsBytes(pngBytes);
|
||||
|
||||
// 将截图保存到相册
|
||||
await ImageGallerySaver.saveFile(imagePath);
|
||||
|
||||
AppLog.log('截图保存路径: $imagePath');
|
||||
@ -366,30 +331,19 @@ class _LockMonitoringPageState extends State<LockMonitoringPage> {
|
||||
}
|
||||
}
|
||||
|
||||
/// 收到视频流数据
|
||||
void _getTVDataRefreshUIAction() {
|
||||
// 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus
|
||||
state.getTVDataRefreshUIEvent =
|
||||
eventBus.on<GetTVDataRefreshUI>().listen((GetTVDataRefreshUI event) async {
|
||||
state.getTVDataRefreshUIEvent = eventBus
|
||||
.on<GetTVDataRefreshUI>()
|
||||
.listen((GetTVDataRefreshUI event) async {
|
||||
if (event.tvList.isNotEmpty && event.tvList.length > 100) {
|
||||
// 比较新旧数据是否相同
|
||||
final Uint8List imageData = Uint8List.fromList(event.tvList);
|
||||
|
||||
if (!listEquals(state.listPhotoData.value, imageData)) {
|
||||
// 更新状态
|
||||
state.listPhotoData.value = imageData;
|
||||
// 设置标志为true,表示需要更新UI
|
||||
state.shouldUpdateUI.value = true;
|
||||
// WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
// 调用setState方法之前检查标志,只有当标志为true时才更新UI
|
||||
if (state.shouldUpdateUI.value) {
|
||||
setState(() {
|
||||
// 更新UI
|
||||
});
|
||||
// 更新完UI后将标志重新设置为false
|
||||
setState(() {});
|
||||
state.shouldUpdateUI.value = false;
|
||||
}
|
||||
// });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_voice_processor/flutter_voice_processor.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:network_info_plus/network_info_plus.dart';
|
||||
import 'package:star_lock/talk/startChart/start_chart_talk_status.dart';
|
||||
|
||||
import '../../../../tools/storage.dart';
|
||||
|
||||
@ -18,8 +19,8 @@ class LockMonitoringState {
|
||||
Future<String?> userMobileIP = NetworkInfo().getWifiIP();
|
||||
Future<String?> userUid = Storage.getUid();
|
||||
|
||||
RxInt udpStatus =
|
||||
0.obs; //0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 9:长按说话
|
||||
// RxInt udpStatus =
|
||||
// 0.obs; //0:初始状态 1:等待监视 2: 3:监视中 4:呼叫成功 5:主角通话中 6:被叫通话 8:被叫通话中 9:长按说话
|
||||
TextEditingController passwordTF = TextEditingController();
|
||||
|
||||
Rx<Uint8List> listPhotoData = Uint8List(0).obs; //得到的视频流字节数据
|
||||
@ -31,10 +32,6 @@ class LockMonitoringState {
|
||||
RxBool isButtonDisabled = false.obs; //是否禁用按钮
|
||||
final int frameLength = 320; //音视频帧长度为320
|
||||
final int sampleRate = 8000; //音频采样率为8000
|
||||
// final int volumeHistoryCapacity = 5; //音量历史记录的容量
|
||||
// final double dbOffset = 50.0; //用于音量计算的偏移量
|
||||
// var volumeHistory = <double>[].obs; //用于存储音量历史记录的列表
|
||||
// var smoothedVolumeValue = 0.0.obs; //存储平滑后的音量值
|
||||
RxString errorMessage = ''.obs;
|
||||
List<List<int>> allFrames = <List<int>>[];
|
||||
|
||||
@ -55,4 +52,6 @@ class LockMonitoringState {
|
||||
|
||||
late Timer openDoorTimer = Timer(const Duration(seconds: 1), () {}); //开门命令定时器
|
||||
RxInt openDoorSeconds = 0.obs;
|
||||
|
||||
RxInt talkStatus = 0.obs; //星图对讲状态
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user