@blueid/access-capacitor 0.102.0 → 0.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/BlueidAccessCapacitor.podspec +2 -1
  2. package/dist/esm/BlueCore_pb.d.ts +8 -0
  3. package/dist/esm/BlueCore_pb.js +10 -0
  4. package/dist/esm/BlueCore_pb.js.map +1 -1
  5. package/dist/esm/BlueSDK_pb.d.ts +48 -0
  6. package/dist/esm/BlueSDK_pb.js +12 -0
  7. package/dist/esm/BlueSDK_pb.js.map +1 -1
  8. package/dist/plugin.cjs.js +22 -0
  9. package/dist/plugin.cjs.js.map +1 -1
  10. package/dist/plugin.js +22 -0
  11. package/dist/plugin.js.map +1 -1
  12. package/ios/CBlueIDAccess.xcframework/ios-arm64/Headers/core/BlueCore.pb.h +2 -0
  13. package/ios/CBlueIDAccess.xcframework/ios-arm64/libCBlueIDAccess.a +0 -0
  14. package/ios/CBlueIDAccess.xcframework/ios-arm64_x86_64-simulator/Headers/core/BlueCore.pb.h +2 -0
  15. package/ios/CBlueIDAccess.xcframework/ios-arm64_x86_64-simulator/libCBlueIDAccess.a +0 -0
  16. package/ios/CBlueIDAccess.xcframework/macos-arm64_x86_64/Headers/core/BlueCore.pb.h +2 -0
  17. package/ios/CBlueIDAccess.xcframework/macos-arm64_x86_64/libCBlueIDAccess.a +0 -0
  18. package/ios/Plugin/BlueIDAccessSDK/BlueAPI.swift +7 -0
  19. package/ios/Plugin/BlueIDAccessSDK/BlueAPIProtocol.swift +13 -0
  20. package/ios/Plugin/BlueIDAccessSDK/BlueAccess.swift +12 -24
  21. package/ios/Plugin/BlueIDAccessSDK/BlueCommands.swift +3 -0
  22. package/ios/Plugin/BlueIDAccessSDK/BlueCore.pb.swift +8 -0
  23. package/ios/Plugin/BlueIDAccessSDK/BlueDFU/BlueDFUPeripheralService.swift +73 -0
  24. package/ios/Plugin/BlueIDAccessSDK/BlueDFU/BlueUpdateAccessDeviceFirmwareCommand.swift +226 -0
  25. package/ios/Plugin/BlueIDAccessSDK/BlueDevices.swift +24 -0
  26. package/ios/Plugin/BlueIDAccessSDK/BlueError.swift +1 -1
  27. package/ios/Plugin/BlueIDAccessSDK/BlueFetch.swift +10 -2
  28. package/ios/Plugin/BlueIDAccessSDK/BlueModal/BlueModal.swift +30 -5
  29. package/ios/Plugin/BlueIDAccessSDK/BlueModal/{BlueSynchronizeAccessDeviceModalSession.swift → BlueStepProgressModalSession.swift} +4 -4
  30. package/ios/Plugin/BlueIDAccessSDK/BlueModal/{BlueSynchronizeAccessDeviceModalView.swift → BlueStepProgressModalView.swift} +98 -66
  31. package/ios/Plugin/BlueIDAccessSDK/BlueSDK.pb.swift +216 -0
  32. package/ios/Plugin/BlueIDAccessSDK/BlueTaskRunner.swift +34 -3
  33. package/ios/Plugin/BlueIDAccessSDK/BlueZip.swift +30 -0
  34. package/package.json +1 -1
@@ -60,11 +60,36 @@ public func blueShowAccessDeviceModal(_ task: @escaping () async throws -> BlueO
60
60
  /// Displays a modal view (sheet) which performs tasks related to synchronizing a device.
61
61
  /// - parameter runner: The Task Runner.
62
62
  public func blueShowSynchronizeAccessDeviceModal(_ runner: BlueTaskRunner) async throws {
63
- let session = BlueSynchronizeAccessDeviceModalSession()
63
+ try await blueShowStepProgressModal(
64
+ title: blueI18n.syncDeviceInProgressTitle,
65
+ failedTitle: blueI18n.syncDeviceFailedTitle,
66
+ completedTitle: blueI18n.syncDeviceCompletedTitle,
67
+ runner: runner
68
+ )
69
+ }
70
+
71
+ /// Displays a modal view (sheet) which performs tasks related to updating a device firmware.
72
+ /// - parameter runner: The Task Runner.
73
+ public func blueShowUpdateAccessDeviceFirmwareModal(_ runner: BlueTaskRunner) async throws {
74
+ try await blueShowStepProgressModal(
75
+ title: blueI18n.dfuInProgressTitle,
76
+ failedTitle: blueI18n.dfuFailedTitle,
77
+ completedTitle: blueI18n.dfuCompletedTitle,
78
+ runner: runner
79
+ )
80
+ }
81
+
82
+ private func blueShowStepProgressModal(
83
+ title: String,
84
+ failedTitle: String,
85
+ completedTitle: String,
86
+ runner: BlueTaskRunner
87
+ ) async throws {
88
+ let session = BlueStepProgressModalSession()
64
89
 
65
90
  blueRunInMainThread {
66
91
  session.begin(
67
- title: blueI18n.syncDeviceInProgressTitle,
92
+ title: title,
68
93
  tasks: runner.getTasks(),
69
94
  dismiss: blueI18n.cmnCancelLabel
70
95
  ) {
@@ -87,17 +112,17 @@ public func blueShowSynchronizeAccessDeviceModal(_ runner: BlueTaskRunner) async
87
112
  session.updateDismiss(blueI18n.cmnCloseLabel)
88
113
 
89
114
  if runner.isFailed() {
90
- session.updateTitle(blueI18n.syncDeviceFailedTitle)
115
+ session.updateTitle(failedTitle)
91
116
  BlueSound.shared.play(BlueNegativeSoundSystemID)
92
117
  } else {
93
- session.updateTitle(blueI18n.syncDeviceCompletedTitle)
118
+ session.updateTitle(completedTitle)
94
119
  BlueSound.shared.play(BluePositiveSoundSystemID)
95
120
  }
96
121
  }
97
122
  }
98
123
  } catch {
99
124
  blueRunInMainThread {
100
- session.updateTitle(blueI18n.syncDeviceFailedTitle)
125
+ session.updateTitle(failedTitle)
101
126
  session.updateDismiss(blueI18n.cmnCloseLabel)
102
127
  BlueSound.shared.play(BlueNegativeSoundSystemID)
103
128
  }
@@ -2,14 +2,14 @@
2
2
  import AVFoundation
3
3
  import SwiftUI
4
4
 
5
- private class HostingController: UIHostingController<BlueSynchronizeAccessDeviceModalView> {
5
+ private class HostingController: UIHostingController<BlueStepProgressModalView> {
6
6
  override var prefersHomeIndicatorAutoHidden: Bool {
7
7
  return true
8
8
  }
9
9
  }
10
10
 
11
- internal class BlueSynchronizeAccessDeviceModalSession {
12
- private let viewModel = BlueSynchronizeAccessDeviceModalViewModel()
11
+ internal class BlueStepProgressModalSession {
12
+ private let viewModel = BlueStepProgressModalViewModel()
13
13
  private var isInvalidated: Bool = false
14
14
 
15
15
  func begin(title: String, tasks: [BlueTask], dismiss: String, _ onDismiss: @escaping () -> Void) {
@@ -18,7 +18,7 @@ internal class BlueSynchronizeAccessDeviceModalSession {
18
18
  viewModel.dismiss = dismiss
19
19
 
20
20
  let hostingController = HostingController(
21
- rootView: BlueSynchronizeAccessDeviceModalView(viewModel) { onDismiss() }
21
+ rootView: BlueStepProgressModalView(viewModel) { onDismiss() }
22
22
  )
23
23
 
24
24
  hostingController.view.backgroundColor = .clear
@@ -13,14 +13,14 @@ private func getColor(_ status: BlueTaskStatus) -> Color {
13
13
  }
14
14
  }
15
15
 
16
- private func getLineColor(_ status: BlueTaskStatus) -> Color {
16
+ private func getTextColor(_ status: BlueTaskStatus) -> Color {
17
17
  switch (status) {
18
- case .ready, .started:
19
- return .gray
20
- case .failed:
21
- return .red
22
- case .succeeded, .skipped:
23
- return .green
18
+ case .ready, .started, .skipped:
19
+ return .black
20
+ case .succeeded:
21
+ return Color(red: 0.0, green: 0.5, blue: 0.0)
22
+ default:
23
+ return getColor(status)
24
24
  }
25
25
  }
26
26
 
@@ -32,42 +32,54 @@ private func getSymbol(_ status: BlueTaskStatus) -> String {
32
32
  return "circle.circle"
33
33
  case .failed:
34
34
  return "xmark.circle"
35
- case .succeeded, .skipped:
35
+ case .succeeded:
36
36
  return "checkmark.circle"
37
+ case .skipped:
38
+ return "minus.circle"
37
39
  }
38
40
  }
39
41
 
40
42
  class BlueTaskModel: ObservableObject, Identifiable {
41
43
  @Published var label: String
42
44
  @Published var status: BlueTaskStatus
45
+ @Published var progress: Float?
43
46
  @Published var statusColor: Color
44
- @Published var lineColor: Color
47
+ @Published var textColor: Color
45
48
  @Published var symbol: String
46
49
  @Published var errorDescription: String
47
50
  @Published var isLast: Bool
48
51
 
49
- private var subscriber: AnyCancellable?
52
+ private var statusSubscriber: AnyCancellable?
53
+ private var progressSubscriber: AnyCancellable?
50
54
 
51
55
  init(_ task: BlueTask, _ isLast: Bool) {
52
56
  self.label = task.label
53
57
  self.status = task.status.value
58
+ self.progress = task.progress?.value
59
+ self.textColor = getTextColor(task.status.value)
54
60
  self.statusColor = getColor(task.status.value)
55
- self.lineColor = getLineColor(task.status.value)
56
61
  self.symbol = getSymbol(task.status.value)
57
62
  self.errorDescription = task.errorDescription ?? ""
58
63
  self.isLast = isLast
59
64
 
60
- self.subscriber = task.status.sink{ [weak self] status in
65
+ self.statusSubscriber = task.status.sink{ [weak self] status in
61
66
  guard let self = self else { return }
62
67
 
63
68
  self.status = status
69
+ self.textColor = getTextColor(status)
64
70
  self.statusColor = getColor(status)
65
- self.lineColor = getLineColor(status)
66
71
  self.symbol = getSymbol(status)
67
72
  self.errorDescription = task.errorDescription ?? ""
68
73
 
69
74
  self.objectWillChange.send()
70
75
  }
76
+
77
+ self.progressSubscriber = task.progress?.sink{ [weak self] progress in
78
+ guard let self = self else { return }
79
+
80
+ self.progress = progress
81
+ self.objectWillChange.send()
82
+ }
71
83
  }
72
84
  }
73
85
 
@@ -90,46 +102,57 @@ struct TaskView: View {
90
102
 
91
103
  Text(task.label)
92
104
  .font(.system(size: 14))
105
+ .foregroundColor(task.textColor)
93
106
  .frame(maxWidth: .infinity, alignment: .leading)
94
107
  }
95
108
 
96
- HStack(alignment: .center) {
97
- if !task.isLast {
109
+ HStack(alignment: .center, spacing: 0) {
110
+ ZStack(alignment: .leading) {
98
111
  Rectangle()
99
- .fill(task.lineColor)
112
+ .fill(task.statusColor)
100
113
  .frame(width: 2)
101
114
  .padding(.horizontal, 10.5)
102
- }
103
-
104
- if !task.errorDescription.isEmpty {
105
- Text(task.errorDescription)
106
- .foregroundColor(.red)
107
- .font(.system(size: 11))
108
- .padding(.vertical, 2)
109
- .multilineTextAlignment(.leading)
115
+ .hidden(task.isLast)
116
+
117
+ if !task.errorDescription.isEmpty {
118
+ Text(task.errorDescription)
119
+ .foregroundColor(.red)
120
+ .font(.system(size: 11))
121
+ .padding(.leading, 32)
122
+ .padding(.bottom, 5)
123
+ .fixedSize(horizontal: false, vertical: true)
124
+ .alignmentGuide(.leading) { d in d[.leading] }
125
+ } else {
126
+ if task.status == .started && task.progress != nil {
127
+ ProgressView(value: task.progress, total: 100)
128
+ .padding(.leading, 32)
129
+ .alignmentGuide(.leading) { d in d[.leading] }
130
+ }
131
+ }
110
132
  }
111
133
  }
112
134
  }
113
135
  }
114
136
  }
115
137
 
116
- class BlueSynchronizeAccessDeviceModalViewModel: ObservableObject {
138
+ class BlueStepProgressModalViewModel: ObservableObject {
117
139
  @Published var title = ""
118
140
  @Published var dismiss: String = ""
119
141
  @Published var dismissEnabled: Bool = true
120
142
  @Published var tasks: [BlueTask]
121
143
 
122
- init(title: String = "", dismiss: String = "", tasks: [BlueTask] = []) {
144
+ init(title: String = "", dismiss: String = "", dismissEnabled: Bool = true, tasks: [BlueTask] = []) {
123
145
  self.title = title
124
146
  self.dismiss = dismiss
147
+ self.dismissEnabled = dismissEnabled
125
148
  self.tasks = tasks
126
149
  }
127
150
  }
128
151
 
129
- struct BlueSynchronizeAccessDeviceModalView: View {
130
- @ObservedObject private var vm: BlueSynchronizeAccessDeviceModalViewModel
152
+ struct BlueStepProgressModalView: View {
153
+ @ObservedObject private var vm: BlueStepProgressModalViewModel
131
154
 
132
- internal var height: CGFloat = 500
155
+ internal var height: CGFloat = 550
133
156
  internal var backgroundColor: UIColor = .white
134
157
  internal var foregroundColor: UIColor = .black
135
158
 
@@ -137,7 +160,7 @@ struct BlueSynchronizeAccessDeviceModalView: View {
137
160
  private let cornerRadius: CGFloat = 35
138
161
 
139
162
  public init(
140
- _ vm: BlueSynchronizeAccessDeviceModalViewModel,
163
+ _ vm: BlueStepProgressModalViewModel,
141
164
  _ onDismiss: @escaping () -> Void)
142
165
  {
143
166
  self.vm = vm
@@ -155,24 +178,30 @@ struct BlueSynchronizeAccessDeviceModalView: View {
155
178
  .foregroundColor(Color(backgroundColor))
156
179
  .shadow(color: .gray, radius: 1)
157
180
 
158
- VStack(alignment: .center) {
181
+ VStack(alignment: .center, spacing: 0) {
159
182
  Text(vm.title)
160
183
  .font(.system(size: 20))
161
184
  .foregroundColor(.gray)
185
+ .multilineTextAlignment(.center)
162
186
 
163
187
  Spacer()
164
188
 
165
- ScrollView {
166
- VStack(alignment: .leading, spacing: 0) {
167
- ForEach(vm.tasks.indices, id: \.self){ index in
168
- TaskView(task: BlueTaskModel(vm.tasks[index], index == vm.tasks.indices.last))
189
+ GeometryReader { geometry in
190
+ ScrollView(.vertical) {
191
+ VStack(alignment: .leading, spacing: 0) {
192
+ ForEach(vm.tasks.indices, id: \.self){ index in
193
+ TaskView(task: BlueTaskModel(vm.tasks[index], index == vm.tasks.indices.last))
194
+ }
169
195
  }
170
- }.padding(.vertical, 10)
196
+ .padding(.vertical, 10)
197
+ .frame(width: geometry.size.width)
198
+ .frame(minHeight: geometry.size.height)
199
+ }
171
200
  }
172
201
 
202
+ Spacer()
203
+
173
204
  if !vm.dismiss.isEmpty {
174
- Spacer()
175
-
176
205
  Button {
177
206
  onDismiss()
178
207
  } label: {
@@ -180,7 +209,8 @@ struct BlueSynchronizeAccessDeviceModalView: View {
180
209
  .font(.system(size: 18))
181
210
  .frame(maxWidth: .infinity)
182
211
  .padding(EdgeInsets(top: 15, leading: 10, bottom: 15, trailing: 10))
183
- .background(Color.gray.opacity(0.5))
212
+ .background(Color.gray.opacity(vm.dismissEnabled ? 0.5 : 0.3))
213
+ .foregroundColor(vm.dismissEnabled ? .black : .gray)
184
214
  .cornerRadius(10)
185
215
  }
186
216
  .disabled(!vm.dismissEnabled)
@@ -198,38 +228,40 @@ struct BlueSynchronizeAccessDeviceModalView: View {
198
228
  }
199
229
  }
200
230
 
231
+ let noop: (BlueTask, BlueSerialTaskRunner) async throws -> BlueTaskResult = { _, _ in .result(nil) }
232
+
201
233
  struct BlueSynchronizeAccessDeviceModalView_Preview: PreviewProvider {
202
234
  static var previews: some View {
203
- BlueSynchronizeAccessDeviceModalView(
204
- BlueSynchronizeAccessDeviceModalViewModel(
205
- title: "Synchronization in Progress",
206
- dismiss: "Cancel",
207
- tasks: [
235
+ BlueStepProgressModalView(
236
+ BlueStepProgressModalViewModel(
237
+ title: "Synchronization has failed (Worst case)",
238
+ dismiss: "Done",
239
+ tasks: Array(1..<12).map { element in
208
240
  BlueTask(
209
- id: "A",
210
- label: "Retrieve device configuration",
241
+ id: element.description,
242
+ label: "Task label - \(element.description)",
211
243
  status: .failed,
212
- error: BlueError(.sdkCredentialNotFound, cause: BlueError(.invalidCrc), detail: "Something is wrong")
213
- ) { _ in .result(nil) },
214
-
215
- BlueTask(
216
- id: "B",
217
- label: "Update device configuration",
218
- status: .succeeded
219
- ) { _ in .result(nil) },
220
-
221
- BlueTask(
222
- id: "C",
223
- label: "Wait for device to restart",
224
- status: .started
225
- ) { _ in .result(nil) },
226
-
244
+ error: BlueError(.sdkDecodeJsonFailed, cause: BlueError(.sdkNetworkError), detail: "Something went wrong ¯\\_(ツ)_/¯"),
245
+ handler: noop
246
+ )
247
+ }
248
+ )
249
+ ) {}
250
+
251
+ BlueStepProgressModalView(
252
+ BlueStepProgressModalViewModel(
253
+ title: "Cancelling...",
254
+ dismiss: "Cancel",
255
+ dismissEnabled: false,
256
+ tasks: Array(1..<12).enumerated().map { (index, element) in
227
257
  BlueTask(
228
- id: "D",
229
- label: "Push system status",
230
- status: .ready
231
- ) { _ in .result(nil) }
232
- ]
258
+ id: element.description,
259
+ label: "Task label - \(element.description)",
260
+ status: index == 1 ? .failed : .succeeded,
261
+ error: index == 1 ? BlueError(.sdkDecodeJsonFailed, cause: BlueError(.sdkNetworkError), detail: "Something went wrong ¯\\_(ツ)_/¯"): nil,
262
+ handler: noop
263
+ )
264
+ }
233
265
  )
234
266
  ) {}
235
267
  }
@@ -405,6 +405,114 @@ public struct BlueI18n {
405
405
  /// Clears the value of `syncDevicePushSystemStatusTaskLabel`. Subsequent reads from it will return its default value.
406
406
  public mutating func clearSyncDevicePushSystemStatusTaskLabel() {_uniqueStorage()._syncDevicePushSystemStatusTaskLabel = nil}
407
407
 
408
+ public var dfuInProgressTitle: String {
409
+ get {return _storage._dfuInProgressTitle ?? "Update in Progress"}
410
+ set {_uniqueStorage()._dfuInProgressTitle = newValue}
411
+ }
412
+ /// Returns true if `dfuInProgressTitle` has been explicitly set.
413
+ public var hasDfuInProgressTitle: Bool {return _storage._dfuInProgressTitle != nil}
414
+ /// Clears the value of `dfuInProgressTitle`. Subsequent reads from it will return its default value.
415
+ public mutating func clearDfuInProgressTitle() {_uniqueStorage()._dfuInProgressTitle = nil}
416
+
417
+ public var dfuFailedTitle: String {
418
+ get {return _storage._dfuFailedTitle ?? "Update has failed"}
419
+ set {_uniqueStorage()._dfuFailedTitle = newValue}
420
+ }
421
+ /// Returns true if `dfuFailedTitle` has been explicitly set.
422
+ public var hasDfuFailedTitle: Bool {return _storage._dfuFailedTitle != nil}
423
+ /// Clears the value of `dfuFailedTitle`. Subsequent reads from it will return its default value.
424
+ public mutating func clearDfuFailedTitle() {_uniqueStorage()._dfuFailedTitle = nil}
425
+
426
+ public var dfuCancellingTitle: String {
427
+ get {return _storage._dfuCancellingTitle ?? "Cancelling..."}
428
+ set {_uniqueStorage()._dfuCancellingTitle = newValue}
429
+ }
430
+ /// Returns true if `dfuCancellingTitle` has been explicitly set.
431
+ public var hasDfuCancellingTitle: Bool {return _storage._dfuCancellingTitle != nil}
432
+ /// Clears the value of `dfuCancellingTitle`. Subsequent reads from it will return its default value.
433
+ public mutating func clearDfuCancellingTitle() {_uniqueStorage()._dfuCancellingTitle = nil}
434
+
435
+ public var dfuCompletedTitle: String {
436
+ get {return _storage._dfuCompletedTitle ?? "Update has been completed"}
437
+ set {_uniqueStorage()._dfuCompletedTitle = newValue}
438
+ }
439
+ /// Returns true if `dfuCompletedTitle` has been explicitly set.
440
+ public var hasDfuCompletedTitle: Bool {return _storage._dfuCompletedTitle != nil}
441
+ /// Clears the value of `dfuCompletedTitle`. Subsequent reads from it will return its default value.
442
+ public mutating func clearDfuCompletedTitle() {_uniqueStorage()._dfuCompletedTitle = nil}
443
+
444
+ public var dfuGetAuthenticationTokenTaskLabel: String {
445
+ get {return _storage._dfuGetAuthenticationTokenTaskLabel ?? "Issue authentication token"}
446
+ set {_uniqueStorage()._dfuGetAuthenticationTokenTaskLabel = newValue}
447
+ }
448
+ /// Returns true if `dfuGetAuthenticationTokenTaskLabel` has been explicitly set.
449
+ public var hasDfuGetAuthenticationTokenTaskLabel: Bool {return _storage._dfuGetAuthenticationTokenTaskLabel != nil}
450
+ /// Clears the value of `dfuGetAuthenticationTokenTaskLabel`. Subsequent reads from it will return its default value.
451
+ public mutating func clearDfuGetAuthenticationTokenTaskLabel() {_uniqueStorage()._dfuGetAuthenticationTokenTaskLabel = nil}
452
+
453
+ public var dfuCheckLatestFwlabel: String {
454
+ get {return _storage._dfuCheckLatestFwlabel ?? "Check latest firmware"}
455
+ set {_uniqueStorage()._dfuCheckLatestFwlabel = newValue}
456
+ }
457
+ /// Returns true if `dfuCheckLatestFwlabel` has been explicitly set.
458
+ public var hasDfuCheckLatestFwlabel: Bool {return _storage._dfuCheckLatestFwlabel != nil}
459
+ /// Clears the value of `dfuCheckLatestFwlabel`. Subsequent reads from it will return its default value.
460
+ public mutating func clearDfuCheckLatestFwlabel() {_uniqueStorage()._dfuCheckLatestFwlabel = nil}
461
+
462
+ public var dfuDownloadLatestFwlabel: String {
463
+ get {return _storage._dfuDownloadLatestFwlabel ?? "Download latest firmware"}
464
+ set {_uniqueStorage()._dfuDownloadLatestFwlabel = newValue}
465
+ }
466
+ /// Returns true if `dfuDownloadLatestFwlabel` has been explicitly set.
467
+ public var hasDfuDownloadLatestFwlabel: Bool {return _storage._dfuDownloadLatestFwlabel != nil}
468
+ /// Clears the value of `dfuDownloadLatestFwlabel`. Subsequent reads from it will return its default value.
469
+ public mutating func clearDfuDownloadLatestFwlabel() {_uniqueStorage()._dfuDownloadLatestFwlabel = nil}
470
+
471
+ public var dfuPrepareUpdateLabel: String {
472
+ get {return _storage._dfuPrepareUpdateLabel ?? "Prepare Update"}
473
+ set {_uniqueStorage()._dfuPrepareUpdateLabel = newValue}
474
+ }
475
+ /// Returns true if `dfuPrepareUpdateLabel` has been explicitly set.
476
+ public var hasDfuPrepareUpdateLabel: Bool {return _storage._dfuPrepareUpdateLabel != nil}
477
+ /// Clears the value of `dfuPrepareUpdateLabel`. Subsequent reads from it will return its default value.
478
+ public mutating func clearDfuPrepareUpdateLabel() {_uniqueStorage()._dfuPrepareUpdateLabel = nil}
479
+
480
+ public var dfuStartBootloaderLabel: String {
481
+ get {return _storage._dfuStartBootloaderLabel ?? "Start Bootloader"}
482
+ set {_uniqueStorage()._dfuStartBootloaderLabel = newValue}
483
+ }
484
+ /// Returns true if `dfuStartBootloaderLabel` has been explicitly set.
485
+ public var hasDfuStartBootloaderLabel: Bool {return _storage._dfuStartBootloaderLabel != nil}
486
+ /// Clears the value of `dfuStartBootloaderLabel`. Subsequent reads from it will return its default value.
487
+ public mutating func clearDfuStartBootloaderLabel() {_uniqueStorage()._dfuStartBootloaderLabel = nil}
488
+
489
+ public var dfuFindDfuperipheralLabel: String {
490
+ get {return _storage._dfuFindDfuperipheralLabel ?? "Find DFU peripheral"}
491
+ set {_uniqueStorage()._dfuFindDfuperipheralLabel = newValue}
492
+ }
493
+ /// Returns true if `dfuFindDfuperipheralLabel` has been explicitly set.
494
+ public var hasDfuFindDfuperipheralLabel: Bool {return _storage._dfuFindDfuperipheralLabel != nil}
495
+ /// Clears the value of `dfuFindDfuperipheralLabel`. Subsequent reads from it will return its default value.
496
+ public mutating func clearDfuFindDfuperipheralLabel() {_uniqueStorage()._dfuFindDfuperipheralLabel = nil}
497
+
498
+ public var dfuUpdateFwlabel: String {
499
+ get {return _storage._dfuUpdateFwlabel ?? "Update firmware"}
500
+ set {_uniqueStorage()._dfuUpdateFwlabel = newValue}
501
+ }
502
+ /// Returns true if `dfuUpdateFwlabel` has been explicitly set.
503
+ public var hasDfuUpdateFwlabel: Bool {return _storage._dfuUpdateFwlabel != nil}
504
+ /// Clears the value of `dfuUpdateFwlabel`. Subsequent reads from it will return its default value.
505
+ public mutating func clearDfuUpdateFwlabel() {_uniqueStorage()._dfuUpdateFwlabel = nil}
506
+
507
+ public var dfuWaitForDeviceToRestartTaskLabel: String {
508
+ get {return _storage._dfuWaitForDeviceToRestartTaskLabel ?? "Wait for device to restart"}
509
+ set {_uniqueStorage()._dfuWaitForDeviceToRestartTaskLabel = newValue}
510
+ }
511
+ /// Returns true if `dfuWaitForDeviceToRestartTaskLabel` has been explicitly set.
512
+ public var hasDfuWaitForDeviceToRestartTaskLabel: Bool {return _storage._dfuWaitForDeviceToRestartTaskLabel != nil}
513
+ /// Clears the value of `dfuWaitForDeviceToRestartTaskLabel`. Subsequent reads from it will return its default value.
514
+ public mutating func clearDfuWaitForDeviceToRestartTaskLabel() {_uniqueStorage()._dfuWaitForDeviceToRestartTaskLabel = nil}
515
+
408
516
  public var unknownFields = SwiftProtobuf.UnknownStorage()
409
517
 
410
518
  public init() {}
@@ -1023,6 +1131,18 @@ extension BlueI18n: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB
1023
1131
  32: .same(proto: "syncDeviceDeployBlacklistEntriesTaskLabel"),
1024
1132
  33: .same(proto: "syncDeviceRetrieveSystemStatusTaskLabel"),
1025
1133
  34: .same(proto: "syncDevicePushSystemStatusTaskLabel"),
1134
+ 35: .same(proto: "dfuInProgressTitle"),
1135
+ 36: .same(proto: "dfuFailedTitle"),
1136
+ 37: .same(proto: "dfuCancellingTitle"),
1137
+ 38: .same(proto: "dfuCompletedTitle"),
1138
+ 39: .same(proto: "dfuGetAuthenticationTokenTaskLabel"),
1139
+ 40: .same(proto: "dfuCheckLatestFWLabel"),
1140
+ 41: .same(proto: "dfuDownloadLatestFWLabel"),
1141
+ 42: .same(proto: "dfuPrepareUpdateLabel"),
1142
+ 43: .same(proto: "dfuStartBootloaderLabel"),
1143
+ 44: .same(proto: "dfuFindDFUPeripheralLabel"),
1144
+ 45: .same(proto: "dfuUpdateFWLabel"),
1145
+ 46: .same(proto: "dfuWaitForDeviceToRestartTaskLabel"),
1026
1146
  ]
1027
1147
 
1028
1148
  fileprivate class _StorageClass {
@@ -1060,6 +1180,18 @@ extension BlueI18n: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB
1060
1180
  var _syncDeviceDeployBlacklistEntriesTaskLabel: String? = nil
1061
1181
  var _syncDeviceRetrieveSystemStatusTaskLabel: String? = nil
1062
1182
  var _syncDevicePushSystemStatusTaskLabel: String? = nil
1183
+ var _dfuInProgressTitle: String? = nil
1184
+ var _dfuFailedTitle: String? = nil
1185
+ var _dfuCancellingTitle: String? = nil
1186
+ var _dfuCompletedTitle: String? = nil
1187
+ var _dfuGetAuthenticationTokenTaskLabel: String? = nil
1188
+ var _dfuCheckLatestFwlabel: String? = nil
1189
+ var _dfuDownloadLatestFwlabel: String? = nil
1190
+ var _dfuPrepareUpdateLabel: String? = nil
1191
+ var _dfuStartBootloaderLabel: String? = nil
1192
+ var _dfuFindDfuperipheralLabel: String? = nil
1193
+ var _dfuUpdateFwlabel: String? = nil
1194
+ var _dfuWaitForDeviceToRestartTaskLabel: String? = nil
1063
1195
 
1064
1196
  static let defaultInstance = _StorageClass()
1065
1197
 
@@ -1100,6 +1232,18 @@ extension BlueI18n: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB
1100
1232
  _syncDeviceDeployBlacklistEntriesTaskLabel = source._syncDeviceDeployBlacklistEntriesTaskLabel
1101
1233
  _syncDeviceRetrieveSystemStatusTaskLabel = source._syncDeviceRetrieveSystemStatusTaskLabel
1102
1234
  _syncDevicePushSystemStatusTaskLabel = source._syncDevicePushSystemStatusTaskLabel
1235
+ _dfuInProgressTitle = source._dfuInProgressTitle
1236
+ _dfuFailedTitle = source._dfuFailedTitle
1237
+ _dfuCancellingTitle = source._dfuCancellingTitle
1238
+ _dfuCompletedTitle = source._dfuCompletedTitle
1239
+ _dfuGetAuthenticationTokenTaskLabel = source._dfuGetAuthenticationTokenTaskLabel
1240
+ _dfuCheckLatestFwlabel = source._dfuCheckLatestFwlabel
1241
+ _dfuDownloadLatestFwlabel = source._dfuDownloadLatestFwlabel
1242
+ _dfuPrepareUpdateLabel = source._dfuPrepareUpdateLabel
1243
+ _dfuStartBootloaderLabel = source._dfuStartBootloaderLabel
1244
+ _dfuFindDfuperipheralLabel = source._dfuFindDfuperipheralLabel
1245
+ _dfuUpdateFwlabel = source._dfuUpdateFwlabel
1246
+ _dfuWaitForDeviceToRestartTaskLabel = source._dfuWaitForDeviceToRestartTaskLabel
1103
1247
  }
1104
1248
  }
1105
1249
 
@@ -1146,6 +1290,18 @@ extension BlueI18n: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB
1146
1290
  if _storage._syncDeviceDeployBlacklistEntriesTaskLabel == nil {return false}
1147
1291
  if _storage._syncDeviceRetrieveSystemStatusTaskLabel == nil {return false}
1148
1292
  if _storage._syncDevicePushSystemStatusTaskLabel == nil {return false}
1293
+ if _storage._dfuInProgressTitle == nil {return false}
1294
+ if _storage._dfuFailedTitle == nil {return false}
1295
+ if _storage._dfuCancellingTitle == nil {return false}
1296
+ if _storage._dfuCompletedTitle == nil {return false}
1297
+ if _storage._dfuGetAuthenticationTokenTaskLabel == nil {return false}
1298
+ if _storage._dfuCheckLatestFwlabel == nil {return false}
1299
+ if _storage._dfuDownloadLatestFwlabel == nil {return false}
1300
+ if _storage._dfuPrepareUpdateLabel == nil {return false}
1301
+ if _storage._dfuStartBootloaderLabel == nil {return false}
1302
+ if _storage._dfuFindDfuperipheralLabel == nil {return false}
1303
+ if _storage._dfuUpdateFwlabel == nil {return false}
1304
+ if _storage._dfuWaitForDeviceToRestartTaskLabel == nil {return false}
1149
1305
  return true
1150
1306
  }
1151
1307
  }
@@ -1192,6 +1348,18 @@ extension BlueI18n: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB
1192
1348
  case 32: try { try decoder.decodeSingularStringField(value: &_storage._syncDeviceDeployBlacklistEntriesTaskLabel) }()
1193
1349
  case 33: try { try decoder.decodeSingularStringField(value: &_storage._syncDeviceRetrieveSystemStatusTaskLabel) }()
1194
1350
  case 34: try { try decoder.decodeSingularStringField(value: &_storage._syncDevicePushSystemStatusTaskLabel) }()
1351
+ case 35: try { try decoder.decodeSingularStringField(value: &_storage._dfuInProgressTitle) }()
1352
+ case 36: try { try decoder.decodeSingularStringField(value: &_storage._dfuFailedTitle) }()
1353
+ case 37: try { try decoder.decodeSingularStringField(value: &_storage._dfuCancellingTitle) }()
1354
+ case 38: try { try decoder.decodeSingularStringField(value: &_storage._dfuCompletedTitle) }()
1355
+ case 39: try { try decoder.decodeSingularStringField(value: &_storage._dfuGetAuthenticationTokenTaskLabel) }()
1356
+ case 40: try { try decoder.decodeSingularStringField(value: &_storage._dfuCheckLatestFwlabel) }()
1357
+ case 41: try { try decoder.decodeSingularStringField(value: &_storage._dfuDownloadLatestFwlabel) }()
1358
+ case 42: try { try decoder.decodeSingularStringField(value: &_storage._dfuPrepareUpdateLabel) }()
1359
+ case 43: try { try decoder.decodeSingularStringField(value: &_storage._dfuStartBootloaderLabel) }()
1360
+ case 44: try { try decoder.decodeSingularStringField(value: &_storage._dfuFindDfuperipheralLabel) }()
1361
+ case 45: try { try decoder.decodeSingularStringField(value: &_storage._dfuUpdateFwlabel) }()
1362
+ case 46: try { try decoder.decodeSingularStringField(value: &_storage._dfuWaitForDeviceToRestartTaskLabel) }()
1195
1363
  default: break
1196
1364
  }
1197
1365
  }
@@ -1306,6 +1474,42 @@ extension BlueI18n: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB
1306
1474
  try { if let v = _storage._syncDevicePushSystemStatusTaskLabel {
1307
1475
  try visitor.visitSingularStringField(value: v, fieldNumber: 34)
1308
1476
  } }()
1477
+ try { if let v = _storage._dfuInProgressTitle {
1478
+ try visitor.visitSingularStringField(value: v, fieldNumber: 35)
1479
+ } }()
1480
+ try { if let v = _storage._dfuFailedTitle {
1481
+ try visitor.visitSingularStringField(value: v, fieldNumber: 36)
1482
+ } }()
1483
+ try { if let v = _storage._dfuCancellingTitle {
1484
+ try visitor.visitSingularStringField(value: v, fieldNumber: 37)
1485
+ } }()
1486
+ try { if let v = _storage._dfuCompletedTitle {
1487
+ try visitor.visitSingularStringField(value: v, fieldNumber: 38)
1488
+ } }()
1489
+ try { if let v = _storage._dfuGetAuthenticationTokenTaskLabel {
1490
+ try visitor.visitSingularStringField(value: v, fieldNumber: 39)
1491
+ } }()
1492
+ try { if let v = _storage._dfuCheckLatestFwlabel {
1493
+ try visitor.visitSingularStringField(value: v, fieldNumber: 40)
1494
+ } }()
1495
+ try { if let v = _storage._dfuDownloadLatestFwlabel {
1496
+ try visitor.visitSingularStringField(value: v, fieldNumber: 41)
1497
+ } }()
1498
+ try { if let v = _storage._dfuPrepareUpdateLabel {
1499
+ try visitor.visitSingularStringField(value: v, fieldNumber: 42)
1500
+ } }()
1501
+ try { if let v = _storage._dfuStartBootloaderLabel {
1502
+ try visitor.visitSingularStringField(value: v, fieldNumber: 43)
1503
+ } }()
1504
+ try { if let v = _storage._dfuFindDfuperipheralLabel {
1505
+ try visitor.visitSingularStringField(value: v, fieldNumber: 44)
1506
+ } }()
1507
+ try { if let v = _storage._dfuUpdateFwlabel {
1508
+ try visitor.visitSingularStringField(value: v, fieldNumber: 45)
1509
+ } }()
1510
+ try { if let v = _storage._dfuWaitForDeviceToRestartTaskLabel {
1511
+ try visitor.visitSingularStringField(value: v, fieldNumber: 46)
1512
+ } }()
1309
1513
  }
1310
1514
  try unknownFields.traverse(visitor: &visitor)
1311
1515
  }
@@ -1349,6 +1553,18 @@ extension BlueI18n: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationB
1349
1553
  if _storage._syncDeviceDeployBlacklistEntriesTaskLabel != rhs_storage._syncDeviceDeployBlacklistEntriesTaskLabel {return false}
1350
1554
  if _storage._syncDeviceRetrieveSystemStatusTaskLabel != rhs_storage._syncDeviceRetrieveSystemStatusTaskLabel {return false}
1351
1555
  if _storage._syncDevicePushSystemStatusTaskLabel != rhs_storage._syncDevicePushSystemStatusTaskLabel {return false}
1556
+ if _storage._dfuInProgressTitle != rhs_storage._dfuInProgressTitle {return false}
1557
+ if _storage._dfuFailedTitle != rhs_storage._dfuFailedTitle {return false}
1558
+ if _storage._dfuCancellingTitle != rhs_storage._dfuCancellingTitle {return false}
1559
+ if _storage._dfuCompletedTitle != rhs_storage._dfuCompletedTitle {return false}
1560
+ if _storage._dfuGetAuthenticationTokenTaskLabel != rhs_storage._dfuGetAuthenticationTokenTaskLabel {return false}
1561
+ if _storage._dfuCheckLatestFwlabel != rhs_storage._dfuCheckLatestFwlabel {return false}
1562
+ if _storage._dfuDownloadLatestFwlabel != rhs_storage._dfuDownloadLatestFwlabel {return false}
1563
+ if _storage._dfuPrepareUpdateLabel != rhs_storage._dfuPrepareUpdateLabel {return false}
1564
+ if _storage._dfuStartBootloaderLabel != rhs_storage._dfuStartBootloaderLabel {return false}
1565
+ if _storage._dfuFindDfuperipheralLabel != rhs_storage._dfuFindDfuperipheralLabel {return false}
1566
+ if _storage._dfuUpdateFwlabel != rhs_storage._dfuUpdateFwlabel {return false}
1567
+ if _storage._dfuWaitForDeviceToRestartTaskLabel != rhs_storage._dfuWaitForDeviceToRestartTaskLabel {return false}
1352
1568
  return true
1353
1569
  }
1354
1570
  if !storagesAreEqual {return false}