[Enhancement]Implement proximity policies#770
Merged
ipavlidakis merged 11 commits intodevelopfrom May 1, 2025
Merged
Conversation
Collaborator
SDK Size
|
Public Interface+ public final class SpeakerProximityPolicy: ProximityPolicy, Hashable, @unchecked Sendable
+
+ public let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public static func ==(lhs: SpeakerProximityPolicy,rhs: SpeakerProximityPolicy)-> Bool
+ public func hash(into hasher: inout Hasher)
+ public func attach(on call: Call)
+ public func detach()
+ public final class VideoProximityPolicy: ProximityPolicy, Hashable, @unchecked Sendable
+
+ public let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public static func ==(lhs: VideoProximityPolicy,rhs: VideoProximityPolicy)-> Bool
+ public func hash(into hasher: inout Hasher)
+ public func attach(on call: Call)
+ public func detach()
+ public enum ProximityState: Hashable, Sendable
+
+ case near, far
+ public protocol ProximityPolicy: Sendable, Hashable
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)
+ public func removeProximityPolicy(_ policy: any ProximityPolicy)
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision |
Public Interface+ public final class SpeakerProximityPolicy: ProximityPolicy, Hashable, @unchecked Sendable
+
+ public let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public static func ==(lhs: SpeakerProximityPolicy,rhs: SpeakerProximityPolicy)-> Bool
+ public func hash(into hasher: inout Hasher)
+ public func attach(on call: Call)
+ public func detach()
+ public enum ProximityState: Hashable, Sendable
+
+ case near, far
+ public final class VideoProximityPolicy: ProximityPolicy, Hashable, @unchecked Sendable
+
+ public let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public static func ==(lhs: VideoProximityPolicy,rhs: VideoProximityPolicy)-> Bool
+ public func hash(into hasher: inout Hasher)
+ public func attach(on call: Call)
+ public func detach()
+ extension ProximityMonitor: InjectionKey
+
+ nonisolated public static var currentValue: ProximityMonitor
+ public final class ProximityMonitor: ObservableObject, @unchecked Sendable
+
+ @MainActor public func startObservation()
+ public func stopObservation()
+ public protocol ProximityPolicy: Sendable, Hashable
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)
+ public func removeProximityPolicy(_ policy: any ProximityPolicy) |
5c803ab to
1a8a4d4
Compare
Public Interface+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public final class ProximityMonitor: ObservableObject, @unchecked Sendable
+
+ @MainActor public func startObservation()
+ public func stopObservation()
+ extension ProximityPolicy
+
+ public var description: String
+ public enum ProximityState: Hashable, Sendable
+
+ case near, far
+ extension ProximityMonitor: InjectionKey
+
+ nonisolated public static var currentValue: ProximityMonitor
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy)
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision |
dafcec1 to
feacae7
Compare
Public Interface+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
+ public protocol ProximityProviding
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ extension ProximityPolicy
+
+ public var description: String
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy) |
feacae7 to
49130f2
Compare
Public Interface+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
+ extension ProximityPolicy
+
+ public var description: String
+ public protocol ProximityProviding
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy)
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision |
49130f2 to
3ef6705
Compare
Public Interface+ public protocol ProximityProviding
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ extension ProximityPolicy
+
+ public var description: String
+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy) |
3ef6705 to
8127e8a
Compare
Public Interface+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ extension ProximityPolicy
+
+ public var description: String
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public protocol ProximityProviding
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy) |
Contributor
martinmitrevski
left a comment
There was a problem hiding this comment.
Nice addition! Just one question (see comments). Additionally, we should add some docs about this.
d49f3d9 to
7c94d60
Compare
Public Interface+ extension ProximityPolicy
+
+ public var description: String
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public protocol ProximityProviding
+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy) |
Public Interface+ public protocol ProximityProviding
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ extension ProximityPolicy
+
+ public var description: String
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy)
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision |
martinmitrevski
approved these changes
Apr 30, 2025
Contributor
Author
Created here |
Public Interface+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ extension ProximityPolicy
+
+ public var description: String
+ public protocol ProximityProviding
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy) |
Public Interface+ public protocol ProximityProviding
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ extension ProximityPolicy
+
+ public var description: String
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy) |
157f01f to
3b31aea
Compare
3b31aea to
eed4c25
Compare
Public Interface+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ extension ProximityPolicy
+
+ public var description: String
+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public protocol ProximityProviding
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy)
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision |
Public Interface+ public protocol ProximityPolicy: Sendable, CustomStringConvertible
+ public final class VideoProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public final class SpeakerProximityPolicy: ProximityPolicy, @unchecked Sendable
+
+ public static let identifier: ObjectIdentifier
+
+
+ public init()
+
+
+ public func didUpdateProximity(_ proximity: ProximityState,on call: Call)
+ public protocol ProximityProviding
+ extension ProximityPolicy
+
+ public var description: String
+ public enum ProximityState: Hashable, Sendable
+
+ case near
+ case far
public class Call: @unchecked Sendable, WSEventsSubscriber
- public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func updateAudioSessionPolicy(_ policy: AudioSessionPolicy)async throws
+ public func addProximityPolicy(_ policy: any ProximityPolicy)throws
+ public func removeProximityPolicy(_ policy: any ProximityPolicy)
public final class CurrentDevice: @unchecked Sendable
-
+ @MainActor public var isProximityMonitoringEnabled: Bool
-
+
- public enum DeviceType: Sendable
+
-
+ public enum DeviceType: Sendable
- case unspecified
+
- case phone
+ case unspecified
- case pad
+ case phone
- case tv
+ case pad
- case carPlay
+ case tv
- case mac
+ case carPlay
- case vision
+ case mac
+ case vision |
|
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



🔗 Issue Links
Resolves https://linear.app/stream/issue/IOS-827/[feature-request]proximity-for-calls
🎯 Goal
Provide proximity based operations during a call.
Documentation
🛠 Implementation
We introduce a new protocol
ProximityPolicythat can be used to define what will happen when the device's proximity change during a call. You can attachProximityPolicyinstances on any Call object.Out of the box, the SDK ships with the following
ProximityPolicyimplementations:SpeakerProximityPolicy: If speaker is enabled when proximity changes tonearthe policy will switch to earpiece. It will then restore speaker when proximity changes tofar.VideoProximityPolicy: The policy disables all video (remote and local) when proximity changes tonearand restores everything back when proximity changes tofar.☑️ Contributor Checklist