From bcc5ee927175d62cdc62f7950a657717db3fe7ca Mon Sep 17 00:00:00 2001 From: gurrium Date: Mon, 13 Jun 2022 20:06:27 +0900 Subject: [PATCH] =?UTF-8?q?[wip]=20=E5=88=87=E6=96=AD=E5=91=A8=E3=82=8A?= =?UTF-8?q?=E3=82=92=E5=AE=9F=E8=A3=85=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Komusou/BluetoothManager.swift | 12 ++++-- Komusou/Mocks.swift | 4 +- Komusou/Settings/SensorSettingView.swift | 51 ++++++++++++++---------- 3 files changed, 41 insertions(+), 26 deletions(-) diff --git a/Komusou/BluetoothManager.swift b/Komusou/BluetoothManager.swift index 9deb70a..1e1c36e 100644 --- a/Komusou/BluetoothManager.swift +++ b/Komusou/BluetoothManager.swift @@ -20,7 +20,7 @@ protocol CentralManager: AnyObject { func stopScan() func retrievePeripherals(withIdentifiers: [UUID]) -> [Peripheral] func connect(_ peripheral: Peripheral, options: [String: Any]?) - func cancelPeripheralConnection(_ identifier: Peripheral) + func cancelPeripheralConnection(_ peripheral: Peripheral) } extension CBCentralManager: CentralManager { @@ -32,8 +32,8 @@ extension CBCentralManager: CentralManager { connect(peripheral as! CBPeripheral, options: options) } - func cancelPeripheralConnection(_ identifier: Peripheral) { - cancelPeripheralConnection(identifier as! CBPeripheral) + func cancelPeripheralConnection(_ peripheral: Peripheral) { + cancelPeripheralConnection(peripheral as! CBPeripheral) } } @@ -241,6 +241,10 @@ final class BluetoothManager: NSObject { connectingCadenceSensorUUID = cadenceSensor.identifier centralManager.connect(cadenceSensor, options: nil) } + + func cancelConnection(_ peripheral: Peripheral) { + centralManager.cancelPeripheralConnection(peripheral) + } } extension BluetoothManager: CentralManagerDelegate { @@ -303,6 +307,8 @@ extension BluetoothManager: CentralManagerDelegate { func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { centralManager(central as CentralManager, didFailToConnect: peripheral as Peripheral, error: error) } + + // TODO: 切断したときのデリゲートメソッドを実装する } extension BluetoothManager: PeripheralDelegate { diff --git a/Komusou/Mocks.swift b/Komusou/Mocks.swift index 6c0864c..2f5c05a 100644 --- a/Komusou/Mocks.swift +++ b/Komusou/Mocks.swift @@ -74,10 +74,10 @@ class CentralManagerMock: CentralManager { private(set) var cancelPeripheralConnectionCallCount = 0 var cancelPeripheralConnectionHandler: ((Peripheral) -> ())? - func cancelPeripheralConnection(_ identifier: Peripheral) { + func cancelPeripheralConnection(_ peripheral: Peripheral) { cancelPeripheralConnectionCallCount += 1 if let cancelPeripheralConnectionHandler = cancelPeripheralConnectionHandler { - cancelPeripheralConnectionHandler(identifier) + cancelPeripheralConnectionHandler(peripheral) } } diff --git a/Komusou/Settings/SensorSettingView.swift b/Komusou/Settings/SensorSettingView.swift index 0f8be31..a19894b 100644 --- a/Komusou/Settings/SensorSettingView.swift +++ b/Komusou/Settings/SensorSettingView.swift @@ -13,11 +13,11 @@ struct SensorSettingView: View { @State private var isSpeedSensorSheetPresented = false @State - private var speedSensorName: String? + private var connectedSpeedSensor: Peripheral? @State private var isCadenceSensorSheetPresented = false @State - private var cadenceSensorName: String? + private var connectedCadenceSensor: Peripheral? @State private var isBluetoothEnabled = true @@ -26,25 +26,25 @@ struct SensorSettingView: View { SensorRow( isSheetPresented: $isSpeedSensorSheetPresented, sensorType: "スピードセンサー", - sensorName: speedSensorName ?? "未接続" + sensorName: connectedSpeedSensor?.name ?? "未接続" ) { - SensorSelectingView(isSheetPresented: $isSpeedSensorSheetPresented) + SensorSelectingView(isSheetPresented: $isSpeedSensorSheetPresented, connectedSensor: BluetoothManager.shared().connectedSpeedSensor) } SensorRow( isSheetPresented: $isCadenceSensorSheetPresented, sensorType: "ケイデンスセンサー", - sensorName: cadenceSensorName ?? "未接続" + sensorName: connectedCadenceSensor?.name ?? "未接続" ) { - SensorSelectingView(isSheetPresented: $isCadenceSensorSheetPresented) + SensorSelectingView(isSheetPresented: $isCadenceSensorSheetPresented, connectedSensor: BluetoothManager.shared().connectedCadenceSensor) } } .listStyle(.insetGrouped) .alert(isBluetoothDisabled: .constant(!isBluetoothEnabled)) - .onReceive(BluetoothManager.shared().$connectedSpeedSensor.map { $0?.name }) { speedSensorName in - self.speedSensorName = speedSensorName + .onReceive(BluetoothManager.shared().$connectedSpeedSensor) { speedSensor in + self.connectedSpeedSensor = speedSensor } - .onReceive(BluetoothManager.shared().$connectedCadenceSensor.map { $0?.name }) { cadenceSensorName in - self.cadenceSensorName = cadenceSensorName + .onReceive(BluetoothManager.shared().$connectedCadenceSensor) { cadenceSensor in + self.connectedCadenceSensor = cadenceSensor } .onReceive(BluetoothManager.shared().$isBluetoothEnabled) { isBluetoothEnabled in self.isBluetoothEnabled = isBluetoothEnabled @@ -81,17 +81,19 @@ struct SensorSelectingView: View { private var state: SensorSelectingViewState @State private var sensorNames = [UUID: String]() + private var connectedSensor: Peripheral? - init(isSheetPresented: Binding) { + init(isSheetPresented: Binding, connectedSensor: Peripheral?) { state = .init(isSheetPresented: isSheetPresented) + self.connectedSensor = connectedSensor } var body: some View { List { - if true { // TODO: 接続済みのセンサーがあったらという条件 + if let connectedSensor = connectedSensor { Section { Button { - // TODO: 切断する + state.cnacelConnection(connectedSensor) } label: { Text("切断する") } @@ -104,7 +106,16 @@ struct SensorSelectingView: View { Button { state.connectToSpeedSensor(uuid: key) } label: { - Text(sensorName) + HStack { + Text(sensorName) + Spacer() + if let connectedSensor = connectedSensor, + key == connectedSensor.identifier + { + Image(systemName: "checkmark") + .foregroundColor(.blue) + } + } } } } @@ -125,12 +136,6 @@ struct SensorSelectingView: View { } } -struct SensorSelectingView_Preview: PreviewProvider { - static var previews: some View { - SensorSelectingView(isSheetPresented: .constant(true)) - } -} - class SensorSelectingViewState: ObservableObject { @Published var didError = false @@ -154,11 +159,15 @@ class SensorSelectingViewState: ObservableObject { } receiveValue: { _ in } .store(in: &cancellables) } + + func cnacelConnection(_ peripheral: Peripheral) { + BluetoothManager.shared().cancelConnection(peripheral) + } } struct SensorSettingView_Previews: PreviewProvider { static var previews: some View { - SensorSelectingView(isSheetPresented: .constant(false)) + SensorSelectingView(isSheetPresented: .constant(false), connectedSensor: nil) .previewLayout(.sizeThatFits) } }