Merge branch 'develop_sky_liyi' into 'develop_sky'

Develop sky liyi

See merge request StarlockTeam/app-starlock!240
This commit is contained in:
李仪 2025-08-05 07:24:39 +00:00
commit c954ee6918
51 changed files with 344 additions and 220 deletions

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1067,7 +1067,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1067,7 +1067,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1066,7 +1066,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1067,7 +1067,7 @@
"波兰语": "Լեհերեն", "波兰语": "Լեհերեն",
"斯洛伐克语": "Սլովենչինա", "斯洛伐克语": "Սլովենչինա",
"捷克语": "Չեշտինա", "捷克语": "Չեշտինա",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1067,7 +1067,7 @@
"波兰语": "პოლსკი", "波兰语": "პოლსკი",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1067,7 +1067,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1065,7 +1065,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -1070,7 +1070,7 @@
"波兰语": "Polski", "波兰语": "Polski",
"斯洛伐克语": "Slovenčina", "斯洛伐克语": "Slovenčina",
"捷克语": "Čeština", "捷克语": "Čeština",
"希腊语": "Ελληνικά", "希腊语": "ελληνικά",
"希伯来语": "עברית", "希伯来语": "עברית",
"塞尔维亚语": "Српски", "塞尔维亚语": "Српски",
"土耳其语": "Türkçe", "土耳其语": "Türkçe",

View File

@ -362,6 +362,27 @@ class BlueManage {
// 00=01= // 00=01=
if (pairStatus == '00') { if (pairStatus == '00') {
return true; // true return true; // true
} else {
// 0~255
int statusValue = int.parse(pairStatus, radix: 16);
// byte01
int byte0 = (statusValue >> 0) & 0x01; //
// byte12
int byte1 = (statusValue >> 1) & 0x01; //
//
bool isPaired = (byte0 == 1);
//
bool hasNewEvent = (byte1 == 1);
//
if (isPaired) {
return true; // false
} else {
return false; // true
}
} }
// 01trueuuid // 01trueuuid
} }
@ -644,7 +665,7 @@ class BlueManage {
scanDevices.clear(); scanDevices.clear();
startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) { startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) {
_connectDevice(scanDevices, deviceName, connectStateCallBack, _connectDevice(scanDevices, deviceName, connectStateCallBack,
isAddEquipment: isAddEquipment, isReconnect: false); isAddEquipment: isAddEquipment, isReconnect: true);
}); });
} else { } else {
connectStateCallBack(BluetoothConnectionState.disconnected); connectStateCallBack(BluetoothConnectionState.disconnected);

View File

@ -1,7 +1,9 @@
import 'package:flustars/flustars.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:star_lock/appRouters.dart'; import 'package:star_lock/appRouters.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart'; import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_logic.dart'; import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_logic.dart';
@ -295,6 +297,132 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
); );
} }
String formatTimestampToHHmm(int timestampMs) {
// 1. DateTime
int timestampSec = timestampMs ~/ 1000;
// 2. DateTime
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestampMs);
// 3. 使 DateFormat "HH:mm"
DateFormat formatter = DateFormat('HH:mm');
return formatter.format(dateTime);
}
String _buildIDByType(DoorLockLogDataItem item) {
final recordType = item.recordType;
switch (recordType) {
case 10:
if (item.username != null && item.username != '') {
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'指纹'.tr +
'开锁'.tr +
'ID${item.username}';
} else {
return item.recordStr ?? '';
}
case 20:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'密码'.tr +
'开锁'.tr +
'ID${item.username}';
case 30:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
''.tr +
'开锁'.tr +
'ID${item.username}';
case 40:
if (item.username != null && item.username != '') {
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'蓝牙'.tr +
'开锁'.tr +
'' +
'ID'.tr +
'${item.username}';
} else {
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'蓝牙'.tr +
'开锁'.tr +
'' +
'ID'.tr +
'${item.userid}';
}
case 50:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'组合模式'.tr +
'开锁'.tr +
'ID${item.username}';
case 60:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'添加指纹'.tr +
'ID${item.username}';
case 70:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'添加密码'.tr +
'ID${item.username}';
case 80:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'添加卡'.tr +
'ID${item.username}';
case 90:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'删除'.tr +
'指纹'.tr +
'ID${item.username}';
case 100:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'删除'.tr +
'密码'.tr +
'ID${item.username}';
case 110:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'删除'.tr +
''.tr +
'ID${item.username}';
case 160:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'人脸'.tr +
'开锁'.tr +
'ID${item.username}';
case 190:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'胁迫指纹'.tr +
'开锁'.tr +
'ID${item.username}';
case 200:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'胁迫密码'.tr +
'开锁'.tr +
'ID${item.username}';
case 210:
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'胁迫卡片'.tr +
'开锁'.tr +
'ID${item.username}';
default:
return item.recordStr ?? '';
}
}
Color _buildTextColorByType(DoorLockLogDataItem item) {
final recordType = item.recordType;
switch (recordType) {
case 120:
case 150:
case 130:
case 190:
case 200:
case 210:
case 220:
return Colors.red;
default:
return Colors.black;
}
}
TimelineTileBuilder _timelineBuilderWidget() { TimelineTileBuilder _timelineBuilderWidget() {
return TimelineTileBuilder.fromStyle( return TimelineTileBuilder.fromStyle(
contentsAlign: ContentsAlign.basic, contentsAlign: ContentsAlign.basic,
@ -309,18 +437,26 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
); );
}, },
child: Padding( child: Padding(
padding: EdgeInsets.only(left: 20.w, top: 20.h), padding: EdgeInsets.only(left: 20.w, top: 20.h, right: 20.w),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Text( // 使 SingleChildScrollView
timelineData.recordStr ?? '', SingleChildScrollView(
textAlign: TextAlign.left, scrollDirection: Axis.horizontal, //
style: TextStyle( child: Text(
color: Colors.black, _buildIDByType(timelineData),
fontSize: 24.sp, textAlign: TextAlign.left,
fontWeight: FontWeight.w600, style: TextStyle(
color: _buildTextColorByType(timelineData),
fontSize: 24.sp,
fontWeight: FontWeight.w600,
),
//
maxLines: 1,
//
overflow: TextOverflow.ellipsis,
), ),
), ),
SizedBox( SizedBox(

View File

@ -281,7 +281,6 @@ class AddFingerprintLogic extends BaseGetXController {
privateKey: getPrivateKeyList, privateKey: getPrivateKeyList,
token: getTokenList, token: getTokenList,
).toString(); ).toString();
showBlueConnetctToastTimer(action: () async { showBlueConnetctToastTimer(action: () async {
final String getMobile = (await Storage.getMobile())!; final String getMobile = (await Storage.getMobile())!;
ApmHelper.instance.trackEvent('add_fingerprint', { ApmHelper.instance.trackEvent('add_fingerprint', {
@ -460,14 +459,7 @@ class AddFingerprintLogic extends BaseGetXController {
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
_initReplySubscription(); _initReplySubscription();
}
@override
void onInit() {
super.onInit();
senderAddFingerprint(); senderAddFingerprint();
} }

View File

@ -122,26 +122,26 @@ class _AddFingerprintPageState extends State<AddFingerprintPage> with RouteAware
String getIconNumber(int number) { String getIconNumber(int number) {
String iconPath = ''; String iconPath = '';
switch (number) { switch (number) {
case 0: case 1:
iconPath = 'images/main/icon_addFingerprint_fingerprint_one.png'; iconPath = 'images/main/icon_addFingerprint_fingerprint_one.png';
break; break;
case 1: case 2:
iconPath = 'images/main/icon_addFingerprint_fingerprint_two.png'; iconPath = 'images/main/icon_addFingerprint_fingerprint_two.png';
break; break;
case 2: case 3:
iconPath = 'images/main/icon_addFingerprint_fingerprint_three.png'; iconPath = 'images/main/icon_addFingerprint_fingerprint_three.png';
break; break;
case 3: case 4:
iconPath = 'images/main/icon_addFingerprint_fingerprint_four.png'; iconPath = 'images/main/icon_addFingerprint_fingerprint_four.png';
break; break;
case 4: case 5:
iconPath = 'images/main/icon_addFingerprint_fingerprint_five.png'; iconPath = 'images/main/icon_addFingerprint_fingerprint_five.png';
break; break;
case 5: case 6:
iconPath = 'images/main/icon_addFingerprint_fingerprint_six.png'; iconPath = 'images/main/icon_addFingerprint_fingerprint_six.png';
break; break;
default: default:
iconPath = 'images/main/icon_addFingerprint_fingerprint_six.png'; iconPath = 'images/main/icon_addFingerprint_fingerprint_one.png';
break; break;
} }
return iconPath; return iconPath;

View File

@ -340,10 +340,10 @@ class FingerprintListLogic extends BaseGetXController {
Future<FingerprintListDataEntity> getFingerprintsListData( Future<FingerprintListDataEntity> getFingerprintsListData(
{required bool isRefresh}) async { {required bool isRefresh}) async {
// //
if (isRefresh) { // if (isRefresh) {
state.fingerprintItemListData.clear(); state.fingerprintItemListData.clear();
pageNo = 1; pageNo = 1;
}
final FingerprintListDataEntity entity = final FingerprintListDataEntity entity =
await ApiRepository.to.getFingerprintsListData( await ApiRepository.to.getFingerprintsListData(
lockId: state.lockId.value.toString(), lockId: state.lockId.value.toString(),

View File

@ -442,10 +442,13 @@ class LockSetLogic extends BaseGetXController {
} }
// //
Future<LockSetInfoEntity> getLockSettingInfoData() async { Future<LockSetInfoEntity> getLockSettingInfoData({
bool isUnShowLoading = false,
}) async {
final LockSetInfoEntity entity = final LockSetInfoEntity entity =
await ApiRepository.to.getLockSettingInfoData( await ApiRepository.to.getLockSettingInfoData(
lockId: state.lockId.toString(), lockId: state.lockId.toString(),
isUnShowLoading: isUnShowLoading,
); );
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
state.lockSetInfoData.value = entity.data!; state.lockSetInfoData.value = entity.data!;
@ -718,7 +721,7 @@ class LockSetLogic extends BaseGetXController {
records: records, records: records,
isUnShowLoading: true); isUnShowLoading: true);
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
await getLockSettingInfoData(); await getLockSettingInfoData(isUnShowLoading: true);
update(); update();
} }
} }

View File

@ -167,11 +167,9 @@ class LockVoiceSettingLogic extends BaseGetXController {
BluetoothConnectionState.disconnected) { BluetoothConnectionState.disconnected) {
dismissEasyLoading(); dismissEasyLoading();
cancelBlueConnetctToastTimer(); cancelBlueConnetctToastTimer();
// 1
Future.delayed(const Duration(seconds: 2), () { //
// +1 sendFileToDevice(data, token);
sendFileToDevice(data, token);
});
// showBlueConnetctToast(); // showBlueConnetctToast();
} }
@ -294,31 +292,6 @@ class LockVoiceSettingLogic extends BaseGetXController {
} }
} }
//
sendGetDeviceModelBleMessage() {
showEasyLoading();
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
});
BlueManage().blueSendData(
BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
BlueManage().writeCharacteristicWithResponse(
GetDeviceModelCommand(
lockID: BlueManage().connectDeviceName,
).packageData(),
);
} else if (deviceConnectionState ==
BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
showBlueConnetctToast();
}
},
);
}
void _startSendLanguageFile() { void _startSendLanguageFile() {
if (state.data == null) return; if (state.data == null) return;
state.voiceSubcontractingIndex = 0; state.voiceSubcontractingIndex = 0;

View File

@ -37,18 +37,29 @@ class _LockVoiceSettingState extends State<LockVoiceSetting> {
barTitle: '锁语音包设置'.tr, barTitle: '锁语音包设置'.tr,
haveBack: false, haveBack: false,
haveOtherLeftWidget: true, haveOtherLeftWidget: true,
leftWidget: TextButton( leftWidget: Container(
onPressed: () { width: 60.w, // leading区域宽度
eventBus child: TextButton(
.fire(RefreshLockListInfoDataEvent(isUnShowLoading: true)); onPressed: () {
Get.offAllNamed(Routers.starLockMain); eventBus
}, .fire(RefreshLockListInfoDataEvent(isUnShowLoading: true));
child: Text( Get.offAllNamed(Routers.starLockMain);
'跳过'.tr, },
style: TextStyle( style: TextButton.styleFrom(
color: Colors.white, padding: EdgeInsets.symmetric(horizontal: 4), //
fontSize: 24.sp, minimumSize: Size.zero, //
fontWeight: FontWeight.w500, tapTargetSize: MaterialTapTargetSize.shrinkWrap, //
),
child: FittedBox(
fit: BoxFit.scaleDown,
child: Text(
'跳过'.tr,
style: TextStyle(
color: Colors.white,
fontSize: 24.sp, //
fontWeight: FontWeight.w500,
),
),
), ),
), ),
), ),
@ -67,111 +78,92 @@ class _LockVoiceSettingState extends State<LockVoiceSetting> {
), ),
], ],
), ),
body: _buildBody(), body: Obx(
), () => ListView(
); padding: EdgeInsets.zero,
} children: [
//
Widget _buildBody() { Container(
return Obx( width: 1.sw,
() => SingleChildScrollView( color: Colors.white,
child: Column( child: Column(
children: [ children: List.generate(
Container( state.soundTypeList.length,
width: 1.sw, (index) {
decoration: BoxDecoration(color: Colors.white), final isLastItem =
child: ListView.builder( index == state.soundTypeList.length - 1;
itemCount: state.soundTypeList.length, final soundType = state.soundTypeList.value[index];
itemBuilder: (BuildContext context, int index) { return CommonItem(
// itemCount - 1 leftTitel: soundType,
final isLastItem = index == state.soundTypeList.length - 1; rightTitle: '',
isHaveLine: !isLastItem,
// platFormSet RxList<Platform> isHaveDirection: false,
final platform = state.soundTypeList.value[index]; isHaveRightWidget: true,
return CommonItem( rightWidget: Radio<String>(
leftTitel: state.soundTypeList.value[index], value: soundType,
rightTitle: '', groupValue: state.soundTypeList
isHaveLine: !isLastItem, .value[state.selectSoundTypeIndex.value],
// 线 activeColor: AppColors.mainColor,
isHaveDirection: false, onChanged: (value) {
isHaveRightWidget: true, if (value != null) {
rightWidget: Radio<String>( final newIndex = state.soundTypeList.value
// Radio 使 id .indexWhere((p) => p == value);
value: platform, if (newIndex != -1) {
// selectPlatFormIndex id state.selectSoundTypeIndex.value = newIndex;
groupValue: state.soundTypeList }
.value[state.selectSoundTypeIndex.value],
//
activeColor: AppColors.mainColor,
// Radio
onChanged: (value) {
if (value != null) {
setState(() {
// id
final newIndex = state.soundTypeList.value
.indexWhere((p) => p == value);
if (newIndex != -1) {
state.selectSoundTypeIndex.value = newIndex;
} }
}); },
} ),
}, action: () {
), state.selectSoundTypeIndex.value = index;
action: () { },
setState(() { );
state.selectSoundTypeIndex.value = index;
});
}, },
); ),
}, ),
shrinkWrap: true,
physics: const AlwaysScrollableScrollPhysics(),
), ),
), SizedBox(
SizedBox( height: 8.h,
height: 8.h, ),
), //
Column( Container(
children: _buildList(), color: Colors.transparent,
), child: Column(
], children: List.generate(
state.languages.length,
(index) {
final item = state.languages[index];
return CommonItem(
leftTitel: item.langText,
rightTitle: '',
isHaveLine: true,
isHaveDirection: false,
isHaveRightWidget: true,
rightWidget:
state.selectPassthroughListIndex.value == index
? Image(
image: const AssetImage(
'images/icon_item_checked.png'),
width: 30.w,
height: 30.w,
fit: BoxFit.contain,
)
: Container(),
action: () {
state.selectPassthroughListIndex.value = index;
},
);
},
),
),
),
],
),
), ),
), ),
); );
} }
List<Widget> _buildList() {
final appLocalLanguages = state.languages;
return List.generate(
appLocalLanguages.length,
(index) => _buildItem(
appLocalLanguages[index],
index,
),
);
}
_buildItem(PassthroughItem passthroughItem, index) {
return CommonItem(
leftTitel: passthroughItem.langText,
rightTitle: '',
isHaveLine: true,
isHaveDirection: false,
isHaveRightWidget: true,
rightWidget: state.selectPassthroughListIndex.value == index
? Image(
image: const AssetImage('images/icon_item_checked.png'),
width: 30.w,
height: 30.w,
fit: BoxFit.contain,
)
: Container(),
action: () {
state.selectPassthroughListIndex.value = index;
},
);
}
@override @override
void dispose() { void dispose() {
// TODO: implement dispose // TODO: implement dispose

View File

@ -428,11 +428,17 @@ class ApiProvider extends BaseProvider {
isUnShowLoading: isUnShowLoading); isUnShowLoading: isUnShowLoading);
// //
Future<Response> getLockSettingInfoData(String lockId) => post( Future<Response> getLockSettingInfoData(
getLockSettingURL.toUrl, String lockId, {
jsonEncode({ bool isUnShowLoading = true,
'lockId': lockId, }) =>
})); post(
getLockSettingURL.toUrl,
jsonEncode({
'lockId': lockId,
}),
isUnShowLoading: isUnShowLoading,
);
// //
Future<Response> getLockSettingInfoDataIsNotLoadingIcon(String lockId) => Future<Response> getLockSettingInfoDataIsNotLoadingIcon(String lockId) =>
@ -2824,9 +2830,9 @@ class ApiProvider extends BaseProvider {
/// ///
Future<Response> reportBuyRequest( Future<Response> reportBuyRequest(
int lockId, int lockId,
String type, String type,
) => ) =>
post( post(
reportBuyRequestURL.toUrl, reportBuyRequestURL.toUrl,
jsonEncode({ jsonEncode({
@ -2836,8 +2842,6 @@ class ApiProvider extends BaseProvider {
isShowNetworkErrorMsg: false, isShowNetworkErrorMsg: false,
isShowErrMsg: false, isShowErrMsg: false,
isUnShowLoading: true); isUnShowLoading: true);
} }
extension ExtensionString on String { extension ExtensionString on String {

View File

@ -493,8 +493,11 @@ class ApiRepository {
// //
Future<LockSetInfoEntity> getLockSettingInfoData( Future<LockSetInfoEntity> getLockSettingInfoData(
{required String lockId}) async { {required String lockId, bool isUnShowLoading = false}) async {
final res = await apiProvider.getLockSettingInfoData(lockId); final res = await apiProvider.getLockSettingInfoData(
lockId,
isUnShowLoading: isUnShowLoading,
);
return LockSetInfoEntity.fromJson(res.body); return LockSetInfoEntity.fromJson(res.body);
} }