diff --git a/lib/generated/intl/messages_all.dart b/lib/generated/intl/messages_all.dart index 14b475fe..f8e82f43 100644 --- a/lib/generated/intl/messages_all.dart +++ b/lib/generated/intl/messages_all.dart @@ -18,6 +18,7 @@ import 'package:intl/src/intl_helpers.dart'; import 'messages_ar.dart' as messages_ar; import 'messages_en.dart' as messages_en; +import 'messages_vi.dart' as messages_vi; import 'messages_zh.dart' as messages_zh; import 'messages_zh_CN.dart' as messages_zh_cn; import 'messages_zh_TW.dart' as messages_zh_tw; @@ -26,6 +27,7 @@ typedef Future LibraryLoader(); Map _deferredLibraries = { 'ar': () => new SynchronousFuture(null), 'en': () => new SynchronousFuture(null), + 'vi': () => new SynchronousFuture(null), 'zh': () => new SynchronousFuture(null), 'zh_CN': () => new SynchronousFuture(null), 'zh_TW': () => new SynchronousFuture(null), @@ -37,6 +39,8 @@ MessageLookupByLibrary? _findExact(String localeName) { return messages_ar.messages; case 'en': return messages_en.messages; + case 'vi': + return messages_vi.messages; case 'zh': return messages_zh.messages; case 'zh_CN': diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index 651e1775..3b3cd17f 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -3211,6 +3211,7 @@ class AppLocalizationDelegate extends LocalizationsDelegate { return const [ Locale.fromSubtags(languageCode: 'en'), Locale.fromSubtags(languageCode: 'ar'), + Locale.fromSubtags(languageCode: 'vi'), Locale.fromSubtags(languageCode: 'zh'), Locale.fromSubtags(languageCode: 'zh', countryCode: 'CN'), Locale.fromSubtags(languageCode: 'zh', countryCode: 'TW'), diff --git a/lib/l10n/intl_vi.arb b/lib/l10n/intl_vi.arb new file mode 100644 index 00000000..9e21d900 --- /dev/null +++ b/lib/l10n/intl_vi.arb @@ -0,0 +1,358 @@ +{ + "appTitle": "ThingsBoard", + "home": "Trang chủ", + "devices": "{count, plural, =1{Thiết bị} other{Thiết bị}}", + "@devices": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "more": "Thêm", + "customers": "Khách hàng", + "assets": "Tài sản", + "auditLogs": "Nhật ký kiểm toán", + "logout": "Đăng xuất", + "login": "Đăng nhập", + "logoDefaultValue": "Logo ThingsBoard", + "loginNotification": "Đăng nhập vào tài khoản của bạn", + "email": "Email", + "emailRequireText": "Email là bắt buộc.", + "emailInvalidText": "Định dạng email không hợp lệ.", + "username": "tên người dùng", + "password": "Mật khẩu", + "passwordRequireText": "Mật khẩu là bắt buộc.", + "passwordForgotText": "Quên mật khẩu?", + "passwordReset": "Đặt lại mật khẩu", + "passwordResetText": "Nhập email được liên kết với tài khoản của bạn và chúng tôi sẽ gửi email có liên kết đặt lại mật khẩu", + "requestPasswordReset": "Yêu cầu đặt lại mật khẩu", + "passwordResetLinkSuccessfullySentNotification": "Liên kết đặt lại mật khẩu đã được gửi thành công!", + "or": "HOẶC", + "no": "Không", + "yes": "Có", + "title": "Tiêu đề", + "country": "Quốc gia", + "city": "Thành phố", + "stateOrProvince": "Tiểu bang / Tỉnh", + "postalCode": "Mã Zip / Bưu chính", + "address": "Địa chỉ", + "address2": "Địa chỉ 2", + "phone": "Điện thoại", + "alarmClearTitle": "Xóa báo động", + "alarmClearText": "Bạn có chắc chắn muốn xóa Báo động không?", + "alarmAcknowledgeTitle": "Xác nhận Báo động", + "alarmAcknowledgeText": "Bạn có chắc chắn muốn xác nhận Báo động không?", + "assetName": "Tên tài sản", + "type": "Loại", + "label": "Nhãn", + "assignedToCustomer": "Đã gán cho khách hàng", + "auditLogDetails": "Chi tiết nhật ký kiểm toán", + "entityType": "Loại thực thể", + "actionData": "Dữ liệu hành động", + "failureDetails": "Chi tiết lỗi", + "allDevices": "Tất cả thiết bị", + "active": "Hoạt động", + "inactive": "Không hoạt động", + "systemAdministrator": "Quản trị viên hệ thống", + "tenantAdministrator": "Quản trị viên tenant", + "customer": "Khách hàng", + "changePassword": "Đổi mật khẩu", + "currentPasswordRequireText": "Mật khẩu hiện tại là bắt buộc.", + "currentPassword": "Mật khẩu hiện tại", + "newPasswordRequireText": "Mật khẩu mới là bắt buộc.", + "newPassword": "Mật khẩu mới", + "newPassword2RequireText": "Yêu cầu nhập lại mật khẩu mới.", + "newPassword2": "Xác nhận mật khẩu mới", + "passwordErrorNotification": "Mật khẩu đã nhập phải giống nhau!", + "firstNameUpper": "Tên", + "lastNameUpper": "Họ", + "profileSuccessNotification": "Hồ sơ được cập nhật thành công", + "passwordSuccessNotification": "Mật khẩu đã được thay đổi thành công", + "notImplemented": "Chưa được thực hiện!", + "listIsEmptyText": "Danh sách hiện đang trống.", + "tryAgain": "Thử lại", + "verifyYourIdentity": "Xác minh danh tính của bạn", + "continueText": "Tiếp tục", + "resendCode": "Gửi lại mã", + "resendCodeWait": "Gửi lại mã trong {time,plural, =1{1 giây}other{{time} giây}}", + "totpAuthDescription": "Vui lòng nhập mã bảo mật từ ứng dụng xác thực của bạn.", + "smsAuthDescription": "Một mã bảo mật đã được gửi đến điện thoại của bạn tại {contact}.", + "emailAuthDescription": "Một mã bảo mật đã được gửi đến địa chỉ email của bạn tại {contact}.", + "backupCodeAuthDescription": "Vui lòng nhập một trong các mã dự phòng của bạn.", + "verificationCodeInvalid": "Định dạng mã xác minh không hợp lệ", + "toptAuthPlaceholder": "Mã", + "smsAuthPlaceholder": "Mã SMS", + "emailAuthPlaceholder": "Mã email", + "backupCodeAuthPlaceholder": "Mã dự phòng", + "verificationCodeIncorrect": "Mã xác minh không chính xác", + "verificationCodeManyRequest": "Quá nhiều yêu cầu kiểm tra mã xác minh", + "tryAnotherWay": "Thử cách khác", + "selectWayToVerify": "Chọn một cách để xác minh", + "mfaProviderTopt": "Ứng dụng xác thực", + "mfaProviderSms": "SMS", + "mfaProviderEmail": "Email", + "mfaProviderBackupCode": "Mã dự phòng", + "newUserText": "Người dùng mới?", + "createAccount": "Tạo tài khoản", + "emailVerification": "Xác minh email", + "emailVerificationSentText": "Một email với chi tiết xác minh đã được gửi đến địa chỉ email được chỉ định ", + "emailVerificationInstructionsText": "Vui lòng làm theo hướng dẫn được cung cấp trong email để hoàn tất thủ tục đăng ký của bạn. Lưu ý: nếu bạn không thấy email trong một thời gian, vui lòng kiểm tra thư mục 'thư rác' của bạn hoặc thử gửi lại email bằng cách nhấp vào nút 'Gửi lại'.", + "resend": "Gửi lại", + "activatingAccount": "Đang kích hoạt tài khoản...", + "accountActivated": "Tài khoản được kích hoạt thành công!", + "emailVerified": "Email đã được xác minh", + "activatingAccountText": "Tài khoản của bạn hiện đang được kích hoạt.\nVui lòng đợi...", + "accountActivatedText": "Chúc mừng!\nTài khoản {appTitle} của bạn đã được kích hoạt.\nBây giờ bạn có thể đăng nhập vào không gian {appTitle} của mình.", + "privacyPolicy": "Chính sách bảo mật", + "cancel": "Hủy", + "accept": "Chấp nhận", + "termsOfUse": "Điều khoản sử dụng", + "firstName": "Tên", + "firstNameRequireText": "Tên là bắt buộc.", + "lastName": "Họ", + "lastNameRequireText": "Họ là bắt buộc.", + "createPassword": "Tạo mật khẩu", + "repeatPassword": "Lặp lại mật khẩu của bạn", + "imNotARobot": "Tôi không phải là người máy", + "signUp": "Đăng ký", + "alreadyHaveAnAccount": "Bạn co săn san để tạo một tai khoản?", + "signIn": "Đăng nhập", + "invalidPasswordLengthMessage": "Mật khẩu của bạn phải dài ít nhất 6 ký tự", + "confirmNotRobotMessage": "Bạn phải xác nhận rằng bạn không phải là người máy", + "acceptPrivacyPolicyMessage": "Bạn phải chấp nhận Chính sách bảo mật của chúng tôi", + "acceptTermsOfUseMessage": "Bạn phải chấp nhận Điều khoản sử dụng của chúng tôi", + "inactiveUserAlreadyExists": "Người dùng không hoạt động đã tồn tại", + "inactiveUserAlreadyExistsMessage": "Đã có người dùng đã đăng ký với địa chỉ email chưa được xác minh.\nNhấp vào nút 'Gửi lại' nếu bạn muốn gửi lại email xác minh.", + "assignee": "Người được giao", + "alarmTypes": "Các loại báo động", + "details": "Chi tiết", + "status": "Trạng thái", + "severity": "Mức độ nghiêm trọng", + "originator": "Người khởi tạo", + "startTime": "Thời gian bắt đầu", + "duration": "Khoảng thời gian", + "days": "ngày", + "hours": "giờ", + "minutes": "phút", + "seconds": "giây", + "viewDashboard": "Xem bảng điều khiển", + "activity": "Hoạt động", + "addCommentMessage": "Thêm bình luận...", + "selectUser": "Chọn người dùng", + "assignedToMe": "Giao cho tôi", + "clear": "Xóa", + "acknowledge": "Xác nhận", + "edit": "Chỉnh sửa", + "delete": "Xóa", + "edited": "Đã chỉnh sửa", + "deleteComment": "Xóa bình luận", + "areYouSure": "Bạn có chắc không?", + "noResultsFound": "Không tìm thấy kết quả nào", + "tryRefiningYourQuery": "Vui lòng thử tinh chỉnh truy vấn của bạn", + "failedToLoadTheList": "Không thể tải danh sách", + "tryRefreshing": "Vui lòng thử làm mới", + "refresh": "Làm mới", + "users": "Người dùng", + "unassigned": "Chưa được gán", + "failedToLoadAlarmDetails": "Không thể tải chi tiết báo động", + "somethingWentWrong": "Đã xảy ra lỗi", + "chooseRegion": "Chọn khu vực", + "selectRegion": "Chọn khu vực", + "northAmerica": "Bắc Mỹ", + "europe": "Châu Âu", + "northAmericaRegionShort": "N. Virginia", + "europeRegionShort": "Frankfurt", + "deviceList": "Danh sách thiết bị", + "dashboards": "{count, plural, =1{Bảng điều khiển} other{Bảng điều khiển}}", + "@dashboards": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "updateRequired": "Yêu cầu cập nhật", + "updateTo": "Cập nhật lên {version}", + "popTitle": "Nhập mã PIN của {deviceName} để xác nhận bằng chứng sở hữu", + "next": "Tiếp theo", + "confirmation": "Xác nhận", + "bleHelpMessage": "Để cấp phép cho thiết bị mới của bạn, vui lòng đảm bảo rằng Bluetooth của điện thoại của bạn được bật và trong phạm vi của thiết bị mới của bạn", + "wifiPassword": "Mật khẩu Wi-Fi", + "wifiHelpMessage": "Để tiếp tục thiết lập thiết bị {deviceName} của bạn, vui lòng cung cấp thông tin đăng nhập Mạng của bạn.", + "wifiPasswordMessage": "Nhập mật khẩu cho {network}", + "deviceNotFoundMessage": "Không tìm thấy thiết bị. Vui lòng đảm bảo rằng Bluetooth của điện thoại của bạn được bật và trong phạm vi của thiết bị mới của bạn.", + "permissionsNotEnoughMessage": "Bạn không có đủ quyền cho \"{permissions}\" để tiếp tục. Vui lòng cấp các quyền cần thiết và nhấn vào \"Thử lại\".", + "sendingWifiCredentials": "Đang gửi thông tin đăng nhập Wi-Fi", + "confirmingWifiConnection": "Đang xác nhận kết nối Wi-Fi", + "provisionedSuccessfully": "Thiết bị đã được cấp phép thành công", + "returnToDashboard": "Quay lại bảng điều khiển", + "cannotEstablishSession": "Không thể thiết lập phiên với thiết bị {deviceName}. Vui lòng thử lại", + "claimingDevice": "Đang xác nhận quyền sở hữu thiết bị", + "claimingDeviceDone": "Xác nhận quyền sở hữu thiết bị đã hoàn tất", + "claimingMessageSuccess": "Thiết bị đã được\nxác nhận quyền sở hữu thành công", + "openAppSettingsToGrantPermissionMessage": "Bạn không có đủ quyền cho \"{permissions}\" để tiếp tục. Vui lòng mở cài đặt ứng dụng, cấp quyền và nhấn vào \"Thử lại\".", + "scanACode": "Quét mã", + "allowAccess": "Cho phép truy cập", + "toggleCamera": "Chuyển đổi máy ảnh", + "toggleFlash": "Bật/tắt đèn flash", + "unableToUseCamera": "Không thể sử dụng máy ảnh", + "openSettingsAndGrantAccessToCameraToContinue": "Mở cài đặt và cấp quyền truy cập vào máy ảnh để tiếp tục", + "notFound": "Không tìm thấy", + "routeNotDefined": "Tuyến đường không được xác định: {name}", + "loginWith": "Đăng nhập với", + "scanQrCode": "Quét mã QR", + "anEmptyRequestDataReceived": "Đã nhận được dữ liệu yêu cầu trống.", + "somethingWentWrongRollback": "Đã xảy ra lỗi ... Quay lại", + "searchResults": "Kết quả tìm kiếm", + "viewAll": "Xem tất cả", + "requestedEntityDoesNotExists": "Thực thể được yêu cầu không tồn tại.", + "noAlarmsFound": "Không tìm thấy báo động nào", + "filters": "Bộ lọc", + "alarmStatusList": "Danh sách trạng thái báo động", + "alarmSeverityList": "Danh sách mức độ nghiêm trọng của báo động", + "cleared": "Đã xóa", + "acknowledged": "Đã xác nhận", + "unacknowledged": "Chưa được xác nhận", + "critical": "Rất nghiêm trọng", + "major": "Nghiêm trọng", + "minor": "Nhẹ", + "warning": "Cảnh báo", + "indeterminate": "Không xác định", + "searchUsers": "{count, plural, =1{Tìm kiếm người dùng} other{Tìm kiếm người dùng}}", + "@searchUsers": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "reset": "Đặt lại", + "update": "Cập nhật", + "alarmTypeList": "Danh sách loại báo động", + "anyType": "Bất kỳ loại nào", + "plusAlarmType": "+ Loại báo động", + "all": "Tất cả", + "unread": "Chưa đọc", + "close": "Đóng", + "codeVerificationFailed": "Xác minh mã không thành công!", + "fatalError": "Lỗi nghiêm trọng", + "unknownError": "Lỗi không xác định.", + "fatalApplicationErrorOccurred": "Đã xảy ra lỗi ứng dụng nghiêm trọng:", + "connectionError": "Lỗi kết nối", + "failedToConnectToServer": "Không thể kết nối với máy chủ", + "retry": "Thử lại", + "mobileDashboardShouldBeConfiguredInDeviceProfile": "Bảng điều khiển di động phải được định cấu hình trong hồ sơ thiết bị!", + "openWifiSettings": "Mở cài đặt Wi-Fi", + "connectToTheWifiYouUsuallyUse": "Kết nối với Wi-Fi bạn thường sử dụng", + "returnToTheAppAndTapReadyButton": "Quay lại ứng dụng và nhấn vào nút Sẵn sàng", + "pleaseFollowTheNextStepsToReconnectnyourPhoneToYour": "Vui lòng làm theo các bước tiếp theo để kết nối lại\nđiện thoại của bạn với Wi-Fi thông thường của bạn", + "pushNotificationsAreNotConfiguredpleaseContactYourSystemAdministrator": "Thông báo đẩy chưa được định cấu hình.\nVui lòng liên hệ với quản trị viên hệ thống của bạn.", + "firebaseIsNotConfiguredPleaseReferToTheOfficialFirebase": "Firebase chưa được định cấu hình.\n Vui lòng tham khảo tài liệu Firebase chính thức để\n hướng dẫn cách thực hiện.", + "markAllAsRead": "Đánh dấu tất cả là đã đọc", + "profile": "Hồ sơ", + "cantLaunchUrlLink": "Không thể khởi chạy url: {link}", + "@cantLaunchUrlLink": { + "placeholders": { + "link": { + "type": "String" + } + } + }, + "noDashboardsFound": "Không tìm thấy bảng điều khiển nào", + "openAppSettings": "Mở cài đặt ứng dụng", + "connectingToDevice": "Đang kết nối với thiết bị", + "connectToDevice": "Kết nối với thiết bị", + "selectWifiNetwork": "Chọn mạng Wi-Fi", + "deviceProvisioning": "Cấp phép thiết bị", + "permissions": "Quyền", + "unableConnectToDevice": "Không thể kết nối với thiết bị", + "deviceNotAbleToFindWifiNearby": "Thiết bị không thể tìm thấy Wi-Fi gần đó", + "connectionToTheWifiNetworkFailednpleaseEnsureThatYour": "Kết nối với mạng Wi-Fi {name} không thành công.\nVui lòng đảm bảo rằng điện thoại của bạn được kết nối với mạng Wi-Fi của thiết bị và quyền truy cập Mạng cục bộ được bật cho ứng dụng này trong cài đặt thiết bị của bạn.", + "unableConnectToWifiBecauseNetworksWasntFoundByDevice": "Không thể kết nối với Wi-Fi vì mạng không được tìm thấy bởi thiết bị {name}", + "pleaseFollowTheNextStepsToConnectYourPhoneTo": "Vui lòng làm theo các bước tiếp theo để kết nối điện thoại của bạn với thiết bị", + "connectToWifiSimilarToWifiname": "Kết nối với Wi-Fi tương tự như {wifiName}", + "ready": "Sẵn sàng", + "exitDeviceProvisioning": "Thoát khỏi cấp phép thiết bị", + "noNotificationsFound": "Không tìm thấy thông báo nào", + "markAsRead": "Đánh dấu là đã đọc", + "url": "Url", + "pleaseScanQrCodeOnYourDevice": "Vui lòng quét mã QR trên thiết bị của bạn", + "search": "Tìm kiếm", + "tenant": "Tenant", + "tenantProfile": "Hồ sơ tenant", + "user": "Người dùng", + "asset": "Tài sản", + "deviceProfile": "Hồ sơ thiết bị", + "assetProfile": "Hồ sơ tài sản", + "alarms": "{count, plural, =1{Báo động} other{Báo động}}", + "@alarms": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "ruleChain": "Chuỗi quy tắc", + "ruleNode": "Nút quy tắc", + "edge": "Edge", + "entityView": "Chế độ xem thực thể", + "widgetsBundle": "Gói widget", + "widgetType": "Loại widget", + "apiUsageState": "Trạng thái sử dụng API", + "tbResource": "Tài nguyên", + "otaPackage": "Gói OTA", + "rpc": "RPC", + "queue": "Hàng đợi", + "notificationTarget": "Mục tiêu thông báo", + "notificationTemplate": "Mẫu thông báo", + "notificationRequest": "Yêu cầu thông báo", + "notifications": "{count, plural, =1{Thông báo} other{Thông báo}}", + "@notifications": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notificationRule": "Quy tắc thông báo", + "actionStatusSuccess": "Thành công", + "actionStatusFailure": "Thất bại", + "actionTypeAdded": "Đã thêm", + "actionTypeDeleted": "Đã xóa", + "actionTypeUpdated": "Đã cập nhật", + "actionTypeAttributesUpdated": "Thuộc tính đã được cập nhật", + "actionTypeAttributesDeleted": "Thuộc tính đã được xóa", + "actionTypeRpcCall": "Cuộc gọi RPC", + "actionTypeCredentialsUpdated": "Thông tin đăng nhập đã được cập nhật", + "actionTypeAssignedToCustomer": "Đã gán cho khách hàng", + "actionTypeUnassignedFromCustomer": "Đã hủy gán khỏi khách hàng", + "actionTypeActivated": "Đã kích hoạt", + "actionTypeSuspended": "Đã tạm ngưng", + "actionTypeCredentialsRead": "Thông tin đăng nhập đã được đọc", + "actionTypeAttributesRead": "Thuộc tính đã được đọc", + "actionTypeRelationAddOrUpdate": "Quan hệ đã được cập nhật", + "actionTypeRelationDeleted": "Quan hệ đã được xóa", + "actionTypeRelationsDeleted": "Tất cả quan hệ đã được xóa", + "actionTypeAlarmAck": "Đã xác nhận", + "actionTypeAlarmClear": "Đã xóa", + "actionTypeAlarmDelete": "Báo động đã được xóa", + "actionTypeAlarmAssigned": "Báo động đã được gán", + "actionTypeAlarmUnassigned": "Báo động đã được hủy gán", + "actionTypeLogin": "Đăng nhập", + "actionTypeLogout": "Đăng xuất", + "actionTypeLockout": "Khóa", + "actionTypeAssignedFromTenant": "Đã gán từ Tenant", + "actionTypeAssignedToTenant": "Đã gán cho Tenant", + "actionTypeProvisionSuccess": "Thiết bị đã được cấp phép", + "actionTypeProvisionFailure": "Cấp phép thiết bị không thành công", + "actionTypeTimeseriesUpdated": "Dữ liệu đo từ xa đã được cập nhật", + "actionTypeTimeseriesDeleted": "Dữ liệu đo từ xa đã được xóa", + "actionTypeAssignedToEdge": "Đã gán cho Edge", + "actionTypeUnassignedFromEdge": "Đã hủy gán khỏi Edge", + "actionTypeAddedComment": "Đã thêm bình luận", + "actionTypeUpdatedComment": "Đã cập nhật bình luận", + "actionTypeDeletedComment": "Đã xóa bình luận", + "actionTypeSmsSent": "Đã gửi SMS", + "isRequiredText": "là bắt buộc." +} \ No newline at end of file diff --git a/lib/modules/device/provisioning/ble/bloc/eps_ble_provisioning_bloc.dart b/lib/modules/device/provisioning/ble/bloc/eps_ble_provisioning_bloc.dart index bc638571..a79c28c9 100644 --- a/lib/modules/device/provisioning/ble/bloc/eps_ble_provisioning_bloc.dart +++ b/lib/modules/device/provisioning/ble/bloc/eps_ble_provisioning_bloc.dart @@ -11,6 +11,7 @@ import 'package:thingsboard_app/modules/device/provisioning/models/provisioning_ import 'package:thingsboard_app/utils/services/communication/events/device_provisioning_status_changed_event.dart'; import 'package:thingsboard_app/utils/services/communication/i_communication_service.dart'; import 'package:thingsboard_app/utils/services/provisioning/eps_ble/i_wifi_provisioning_service.dart'; +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; class EspBleProvisioningBloc extends Bloc { @@ -98,6 +99,19 @@ class EspBleProvisioningBloc } } + // Check if Bluetooth is available and enabled + if (await FlutterBluePlus.isSupported == false) { + return; + } + if (await FlutterBluePlus.adapterState.first != BluetoothAdapterState.on) { + // Attempt to enable Bluetooth + try { + await FlutterBluePlus.turnOn(); + } catch (e) { + return; + } + } + try { // This workaround because otherwise the library don't start connection to device. await bleProvisioningService.scanBleDevices(''); diff --git a/pubspec.lock b/pubspec.lock index 8e974fee..d05fa0b7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -145,6 +145,14 @@ packages: url: "https://pub.dev" source: hosted version: "9.1.7" + bluez: + dependency: transitive + description: + name: bluez + sha256: "61a7204381925896a374301498f2f5399e59827c6498ae1e924aaa598751b545" + url: "https://pub.dev" + source: hosted + version: "0.8.3" boolean_selector: dependency: transitive description: @@ -703,6 +711,54 @@ packages: url: "https://pub.dev" source: hosted version: "8.1.6" + flutter_blue_plus: + dependency: "direct main" + description: + name: flutter_blue_plus + sha256: "69a8c87c11fc792e8cf0f997d275484fbdb5143ac9f0ac4d424429700cb4e0ed" + url: "https://pub.dev" + source: hosted + version: "1.36.8" + flutter_blue_plus_android: + dependency: transitive + description: + name: flutter_blue_plus_android + sha256: "6f7fe7e69659c30af164a53730707edc16aa4d959e4c208f547b893d940f853d" + url: "https://pub.dev" + source: hosted + version: "7.0.4" + flutter_blue_plus_darwin: + dependency: transitive + description: + name: flutter_blue_plus_darwin + sha256: "682982862c1d964f4d54a3fb5fccc9e59a066422b93b7e22079aeecd9c0d38f8" + url: "https://pub.dev" + source: hosted + version: "7.0.3" + flutter_blue_plus_linux: + dependency: transitive + description: + name: flutter_blue_plus_linux + sha256: "56b0c45edd0a2eec8f85bd97a26ac3cd09447e10d0094fed55587bf0592e3347" + url: "https://pub.dev" + source: hosted + version: "7.0.3" + flutter_blue_plus_platform_interface: + dependency: transitive + description: + name: flutter_blue_plus_platform_interface + sha256: "84fbd180c50a40c92482f273a92069960805ce324e3673ad29c41d2faaa7c5c2" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter_blue_plus_web: + dependency: transitive + description: + name: flutter_blue_plus_web + sha256: a1aceee753d171d24c0e0cdadb37895b5e9124862721f25f60bb758e20b72c99 + url: "https://pub.dev" + source: hosted + version: "7.0.2" flutter_cache_manager: dependency: transitive description: @@ -1389,6 +1445,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.19.0" + intl_utils: + dependency: "direct dev" + description: + name: intl_utils + sha256: da67ac187b521445d745f7c68e7254c2090f6c3c9081c93cd515480af9e59569 + url: "https://pub.dev" + source: hosted + version: "2.8.11" io: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4bace68e..5b5b2719 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -76,6 +76,7 @@ dependencies: freezed_annotation: ^3.1.0 json_annotation: ^4.9.0 mobile_scanner: ^7.0.1 + flutter_blue_plus: ^1.32.8 flutter_hooks: ^0.21.2 esp_provisioning_softap: git: @@ -109,6 +110,8 @@ dev_dependencies: riverpod_generator: ^2.6.5 json_serializable: ^6.9.5 freezed: ^3.1.0 + flutter_gen: ^5.11.0 + intl_utils: ^2.8.11 dependency_overrides: logger: ^2.5.0 http: ^1.3.0 @@ -116,6 +119,7 @@ dependency_overrides: flutter: uses-material-design: true + generate: true assets: - assets/images/