From 387c4e22273b6276c3fbb5a6ed5563ad9b905685 Mon Sep 17 00:00:00 2001 From: Radu Vlad Date: Wed, 6 May 2020 16:34:03 +0300 Subject: [PATCH 1/4] Added support for observing ancsAuthorized property on peripheral. --- Source/CBCentralManagerDelegateWrapper.swift | 13 +++++++++++++ Source/CentralManager.swift | 19 +++++++++++++++++++ Tests/Autogenerated/Mock.generated.swift | 7 +++++++ .../_CentralManager.generated.swift | 19 +++++++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/Source/CBCentralManagerDelegateWrapper.swift b/Source/CBCentralManagerDelegateWrapper.swift index beb24e15..c8ebda01 100644 --- a/Source/CBCentralManagerDelegateWrapper.swift +++ b/Source/CBCentralManagerDelegateWrapper.swift @@ -10,6 +10,7 @@ class CBCentralManagerDelegateWrapper: NSObject, CBCentralManagerDelegate { let didConnectPeripheral = PublishSubject() let didFailToConnectPeripheral = PublishSubject<(CBPeripheral, Error?)>() let didDisconnectPeripheral = PublishSubject<(CBPeripheral, Error?)>() + let didUpdateANCSAuthorizationForPeripheral = PublishSubject<(CBPeripheral)>() func centralManagerDidUpdateState(_ central: CBCentralManager) { guard let bleState = BluetoothState(rawValue: central.state.rawValue) else { return } @@ -59,4 +60,16 @@ class CBCentralManagerDelegateWrapper: NSObject, CBCentralManagerDelegate { """) didDisconnectPeripheral.onNext((peripheral, error)) } + + #if !os(macOS) + @available(iOS 13.0, watchOS 6.0, tvOS 13.0, *) + func centralManager(_ central: CBCentralManager, + didUpdateANCSAuthorizationFor peripheral: CBPeripheral) { + RxBluetoothKitLog.d(""" + \(central.logDescription) didUpdateANCSAuthorizationFor + (peripheral: \(peripheral.logDescription) + """) + didUpdateANCSAuthorizationForPeripheral.onNext(peripheral) + } + #endif } diff --git a/Source/CentralManager.swift b/Source/CentralManager.swift index 7437a8ae..83b5e4f5 100644 --- a/Source/CentralManager.swift +++ b/Source/CentralManager.swift @@ -285,6 +285,25 @@ public class CentralManager: ManagerType { } } + + // MARK: ANCS + + /// Emits boolean values according to ancsAuthorized property on a CBPeripheral. + /// + /// - parameter peripheral: `Peripheral` which is observed for ancsAuthorized chances. + /// - returns: Observable which emits next events when `ancsAuthorized` property changes on a peripheral. + #if !os(macOS) + @available(iOS 13.0, watchOS 6.0, tvOS 13.0, *) + public func observeANCSAuthorized(for peripheral: Peripheral) -> Observable { + let observable = delegateWrapper.didUpdateANCSAuthorizationForPeripheral + .asObservable() + .filter { $0 == peripheral.peripheral } + .map { $0.ancsAuthorized } + + return ensure(.poweredOn, observable: observable) + } + #endif + // MARK: Internal functions /// Ensure that specified `peripheral` is connected during subscription. diff --git a/Tests/Autogenerated/Mock.generated.swift b/Tests/Autogenerated/Mock.generated.swift index 8eb2dedd..92cbfb1e 100644 --- a/Tests/Autogenerated/Mock.generated.swift +++ b/Tests/Autogenerated/Mock.generated.swift @@ -555,6 +555,7 @@ class CBCentralManagerDelegateWrapperMock: NSObject , CBCentralManagerDelegate { var didConnectPeripheral = PublishSubject() var didFailToConnectPeripheral = PublishSubject<(CBPeripheralMock, Error?)>() var didDisconnectPeripheral = PublishSubject<(CBPeripheralMock, Error?)>() + var didUpdateANCSAuthorizationForPeripheral = PublishSubject<(CBPeripheral)>() override init() { } @@ -577,6 +578,12 @@ class CBCentralManagerDelegateWrapperMock: NSObject , CBCentralManagerDelegate { func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { } + #if !os(macOS) + @available(iOS 13.0, watchOS 6.0, tvOS 13.0, *) + func centralManager(_ central: CBCentralManager, didUpdateANCSAuthorizationFor peripheral: CBPeripheral) { + } + #endif + } class CBPeripheralManagerDelegateWrapperMock: NSObject , CBPeripheralManagerDelegate { var didUpdateState = PublishSubject() diff --git a/Tests/Autogenerated/_CentralManager.generated.swift b/Tests/Autogenerated/_CentralManager.generated.swift index ad0a5cb8..936cb507 100644 --- a/Tests/Autogenerated/_CentralManager.generated.swift +++ b/Tests/Autogenerated/_CentralManager.generated.swift @@ -286,6 +286,25 @@ class _CentralManager: _ManagerType { } } + + // MARK: ANCS + + /// Emits boolean values according to ancsAuthorized property on a CBPeripheralMock. + /// + /// - parameter peripheral: `_Peripheral` which is observed for ancsAuthorized chances. + /// - returns: Observable which emits next events when `ancsAuthorized` property changes on a peripheral. + #if !os(macOS) + @available(iOS 13.0, watchOS 6.0, tvOS 13.0, *) + func observeANCSAuthorized(for peripheral: _Peripheral) -> Observable { + let observable = delegateWrapper.didUpdateANCSAuthorizationForPeripheral + .asObservable() + .filter { $0 == peripheral.peripheral } + .map { $0.ancsAuthorized } + + return ensure(.poweredOn, observable: observable) + } + #endif + // MARK: Internal functions /// Ensure that specified `peripheral` is connected during subscription. From 43db7b24ccdd1c47dd2595370f267a9d3251a704 Mon Sep 17 00:00:00 2001 From: Radu Vlad Date: Thu, 7 May 2020 14:41:55 +0300 Subject: [PATCH 2/4] Regenerated Mocks using script. Minor fixes for ancsAuthorized observable to support the testing framework. --- Source/CentralManager.swift | 6 ++++-- Tests/Autogenerated/Mock.generated.swift | 6 ++---- Tests/Autogenerated/_CentralManager.generated.swift | 6 ++++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Source/CentralManager.swift b/Source/CentralManager.swift index 83b5e4f5..75f9429f 100644 --- a/Source/CentralManager.swift +++ b/Source/CentralManager.swift @@ -285,7 +285,6 @@ public class CentralManager: ManagerType { } } - // MARK: ANCS /// Emits boolean values according to ancsAuthorized property on a CBPeripheral. @@ -298,7 +297,10 @@ public class CentralManager: ManagerType { let observable = delegateWrapper.didUpdateANCSAuthorizationForPeripheral .asObservable() .filter { $0 == peripheral.peripheral } - .map { $0.ancsAuthorized } + // ancsAuthorized is a Bool by default, but the testing framework + // will use Bool! instead. In order to support that we are converting + // to optional and unwrapping the value. + .map { ($0.ancsAuthorized as Bool?)! } return ensure(.poweredOn, observable: observable) } diff --git a/Tests/Autogenerated/Mock.generated.swift b/Tests/Autogenerated/Mock.generated.swift index 92cbfb1e..842bb0ac 100644 --- a/Tests/Autogenerated/Mock.generated.swift +++ b/Tests/Autogenerated/Mock.generated.swift @@ -168,6 +168,7 @@ class CBPeripheralMock: CBPeerMock { var state: CBPeripheralState! var services: [CBServiceMock]? var canSendWriteWithoutResponse: Bool! + var ancsAuthorized: Bool! var logDescription: String! var uuidIdentifier: UUID! @@ -555,7 +556,7 @@ class CBCentralManagerDelegateWrapperMock: NSObject , CBCentralManagerDelegate { var didConnectPeripheral = PublishSubject() var didFailToConnectPeripheral = PublishSubject<(CBPeripheralMock, Error?)>() var didDisconnectPeripheral = PublishSubject<(CBPeripheralMock, Error?)>() - var didUpdateANCSAuthorizationForPeripheral = PublishSubject<(CBPeripheral)>() + var didUpdateANCSAuthorizationForPeripheral = PublishSubject<(CBPeripheralMock)>() override init() { } @@ -578,11 +579,8 @@ class CBCentralManagerDelegateWrapperMock: NSObject , CBCentralManagerDelegate { func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { } - #if !os(macOS) - @available(iOS 13.0, watchOS 6.0, tvOS 13.0, *) func centralManager(_ central: CBCentralManager, didUpdateANCSAuthorizationFor peripheral: CBPeripheral) { } - #endif } class CBPeripheralManagerDelegateWrapperMock: NSObject , CBPeripheralManagerDelegate { diff --git a/Tests/Autogenerated/_CentralManager.generated.swift b/Tests/Autogenerated/_CentralManager.generated.swift index 936cb507..dbb1ca49 100644 --- a/Tests/Autogenerated/_CentralManager.generated.swift +++ b/Tests/Autogenerated/_CentralManager.generated.swift @@ -286,7 +286,6 @@ class _CentralManager: _ManagerType { } } - // MARK: ANCS /// Emits boolean values according to ancsAuthorized property on a CBPeripheralMock. @@ -299,7 +298,10 @@ class _CentralManager: _ManagerType { let observable = delegateWrapper.didUpdateANCSAuthorizationForPeripheral .asObservable() .filter { $0 == peripheral.peripheral } - .map { $0.ancsAuthorized } + // ancsAuthorized is a Bool by default, but the testing framework + // will use Bool! instead. In order to support that we are converting + // to optional and unwrapping the value. + .map { ($0.ancsAuthorized as Bool?)! } return ensure(.poweredOn, observable: observable) } From 674583e685252d913951b2cf9ab2832aa4e92444 Mon Sep 17 00:00:00 2001 From: Radu Vlad Date: Thu, 27 Aug 2020 11:43:59 +0300 Subject: [PATCH 3/4] Add missing if guard in Mocks. --- Tests/Autogenerated/Mock.generated.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/Autogenerated/Mock.generated.swift b/Tests/Autogenerated/Mock.generated.swift index 842bb0ac..7bef44e4 100644 --- a/Tests/Autogenerated/Mock.generated.swift +++ b/Tests/Autogenerated/Mock.generated.swift @@ -579,9 +579,10 @@ class CBCentralManagerDelegateWrapperMock: NSObject , CBCentralManagerDelegate { func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { } + #if !os(macOS) func centralManager(_ central: CBCentralManager, didUpdateANCSAuthorizationFor peripheral: CBPeripheral) { } - + #endif } class CBPeripheralManagerDelegateWrapperMock: NSObject , CBPeripheralManagerDelegate { var didUpdateState = PublishSubject() From d22c48e7cb599994266e7c8e589956d55fc7441b Mon Sep 17 00:00:00 2001 From: Radu Vlad Date: Fri, 28 Aug 2020 16:25:13 +0300 Subject: [PATCH 4/4] Updated Mocks. --- Tests/Autogenerated/Mock.generated.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Tests/Autogenerated/Mock.generated.swift b/Tests/Autogenerated/Mock.generated.swift index 8f5e6135..2bd7d33b 100644 --- a/Tests/Autogenerated/Mock.generated.swift +++ b/Tests/Autogenerated/Mock.generated.swift @@ -596,6 +596,11 @@ class CBCentralManagerDelegateWrapperMock: NSObject , CBCentralManagerDelegate { func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { } + + #if !os(macOS) + func centralManager(_ central: CBCentralManager, didUpdateANCSAuthorizationFor peripheral: CBPeripheral) { + } + #endif } class CBPeripheralManagerDelegateWrapperMock: NSObject , CBPeripheralManagerDelegate { var didUpdateState = PublishSubject()