@@ -29,6 +29,7 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
2929 var isProximitySupported : Bool = false
3030 var isProximityRegistered : Bool = false
3131 var proximityIsNear : Bool = false
32+ var proximityObserver : NSObjectProtocol ?
3233 var defaultAudioMode : String = AVAudioSessionModeVoiceChat
3334 var defaultAudioCategory : String = AVAudioSessionCategoryPlayAndRecord
3435 var origAudioCategory : String !
@@ -62,7 +63,6 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
6263 }
6364 print ( " start() InCallManager " )
6465 self . storeOriginalAudioSetup ( )
65- _ = try ? self . audioSession. setActive ( false )
6666 //self.audioSession.setCategory(defaultAudioCategory, options: [.DefaultToSpeaker, .AllowBluetooth])
6767 _ = try ? self . audioSession. setCategory ( self . defaultAudioCategory)
6868 _ = try ? self . audioSession. setMode ( self . defaultAudioMode)
@@ -155,8 +155,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
155155 print ( " startProximitySensor() " )
156156 self . currentDevice. proximityMonitoringEnabled = true
157157
158- // self.stopObserve(self, name: UIDeviceProximityStateDidChangeNotification, object: self.currentDevice)
159- self . startObserve ( UIDeviceProximityStateDidChangeNotification, object: self . currentDevice, queue: nil ) { notification in
158+ self . stopObserve ( self . proximityObserver , name: UIDeviceProximityStateDidChangeNotification, object: nil ) // --- in case it didn't deallocate when ViewDidUnload
159+ self . proximityObserver = self . startObserve ( UIDeviceProximityStateDidChangeNotification, object: self . currentDevice, queue: nil ) { notification in
160160 let state : Bool = self . currentDevice. proximityState
161161 if state != self . proximityIsNear {
162162 print ( " Proximity Changed. isNear: \( state) " )
@@ -173,16 +173,18 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
173173
174174 print ( " stopProximitySensor() " )
175175 self . currentDevice. proximityMonitoringEnabled = false
176- self . stopObserve ( self , name: UIDeviceProximityStateDidChangeNotification, object: self . currentDevice )
176+ self . stopObserve ( self . proximityObserver , name: UIDeviceProximityStateDidChangeNotification, object: nil ) // --- remove all no matter what object
177177 self . isProximityRegistered = false
178178 }
179179
180- func startObserve( name: String , object: AnyObject ? , queue: NSOperationQueue ? , block: ( NSNotification ) -> ( ) ) {
181- NSNotificationCenter . defaultCenter ( ) . addObserverForName ( name, object: object, queue: queue, usingBlock: block)
180+ func startObserve( name: String , object: AnyObject ? , queue: NSOperationQueue ? , block: ( NSNotification ) -> ( ) ) -> NSObjectProtocol {
181+ return NSNotificationCenter . defaultCenter ( ) . addObserverForName ( name, object: object, queue: queue, usingBlock: block)
182182 }
183183
184- func stopObserve( observer: AnyObject , name: String ? , object: AnyObject ? ) {
185- NSNotificationCenter . defaultCenter ( ) . removeObserver ( observer, name: name, object: object)
184+ func stopObserve( _observer: AnyObject ? , name: String ? , object: AnyObject ? ) -> Void {
185+ if let observer = _observer {
186+ NSNotificationCenter . defaultCenter ( ) . removeObserver ( observer, name: name, object: object)
187+ }
186188 }
187189
188190 // --- _ringbackUriType: never go here with be empty string.
@@ -212,10 +214,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
212214 self . mRingback. prepareToPlay ( )
213215 //self.audioSession.setCategory(defaultAudioCategory, options: [.DefaultToSpeaker, .AllowBluetooth])
214216
215- _ = try ? self . audioSession. setActive ( false )
216217 _ = try ? self . audioSession. setCategory ( self . defaultAudioCategory)
217218 _ = try ? self . audioSession. setMode ( self . defaultAudioMode)
218- _ = try ? self . audioSession. setActive ( true )
219219 self . mRingback. play ( )
220220 } catch {
221221 print ( " startRingtone() failed " )
@@ -260,10 +260,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
260260 self . mBusytone. prepareToPlay ( )
261261 //self.audioSession.setCategory(defaultAudioCategory, options: [.DefaultToSpeaker, .AllowBluetooth])
262262
263- _ = try ? self . audioSession. setActive ( false )
264263 _ = try ? self . audioSession. setCategory ( self . defaultAudioCategory)
265264 _ = try ? self . audioSession. setMode ( self . defaultAudioMode)
266- _ = try ? self . audioSession. setActive ( true )
267265 self . mBusytone. play ( )
268266 } catch {
269267 print ( " startRingtone() failed " )
@@ -309,10 +307,8 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
309307 self . mRingtone. prepareToPlay ( )
310308 //self.audioSession.setCategory(defaultAudioCategory, options: [.DefaultToSpeaker, .AllowBluetooth])
311309
312- _ = try ? self . audioSession. setActive ( false )
313310 _ = try ? self . audioSession. setCategory ( AVAudioSessionCategorySoloAmbient)
314311 _ = try ? self . audioSession. setMode ( AVAudioSessionModeDefault)
315- _ = try ? self . audioSession. setActive ( true )
316312 self . mRingtone. play ( )
317313 } catch {
318314 print ( " startRingtone() failed " )
@@ -401,13 +397,13 @@ class RNInCallManager: NSObject, AVAudioPlayerDelegate {
401397 // --- this only called when all loop played. it means, an infinite (numberOfLoops = -1) loop will never into here.
402398 //if player.url!.isFileReferenceURL() {
403399 let filename = player. url? . URLByDeletingPathExtension? . lastPathComponent
400+ print ( " finished playing: \( filename) " )
404401 if filename == self . bundleBusytoneUri? . URLByDeletingPathExtension? . lastPathComponent
405402 || filename == self . defaultBusytoneUri? . URLByDeletingPathExtension? . lastPathComponent {
406403 //self.stopBusytone()
407404 print ( " busytone finished, invoke stop() " )
408405 self . stop ( " " )
409406 }
410- print ( " finished playing: \( filename) " )
411407 }
412408
413409 func audioPlayerDecodeErrorDidOccur( player: AVAudioPlayer ! , error: NSError ! ) {
0 commit comments