@qusaieilouti99/call-manager 0.1.26 → 0.1.28

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.
@@ -5,6 +5,7 @@ import android.content.ComponentName
5
5
  import android.content.Context
6
6
  import android.content.Intent
7
7
  import android.media.AudioAttributes
8
+ import android.media.AudioManager.AudioDeviceCallback
8
9
  import android.media.RingtoneManager
9
10
  import android.os.Build
10
11
  import android.os.Bundle
@@ -30,6 +31,7 @@ object CallEngine {
30
31
  private var ringtone: android.media.Ringtone? = null
31
32
  private var audioManager: AudioManager? = null
32
33
  private var wakeLock: PowerManager.WakeLock? = null
34
+ private var appContext: Context? = null
33
35
 
34
36
  // --- Multi-call state ---
35
37
  private val activeCalls = ConcurrentHashMap<String, CallInfo>() // callId -> CallInfo
@@ -78,6 +80,7 @@ object CallEngine {
78
80
  }
79
81
 
80
82
  fun reportIncomingCall(context: Context, callId: String, callData: String) {
83
+ appContext = context.applicationContext
81
84
  Log.d(TAG, "reportIncomingCall: $callId, $callData")
82
85
  val callerName = try {
83
86
  val json = JSONObject(callData)
@@ -304,7 +307,7 @@ object CallEngine {
304
307
  }
305
308
 
306
309
  // --- Audio Device Change Listener ---
307
- private val audioDeviceCallback = object : AudioManager.AudioDeviceCallback() {
310
+ private val audioDeviceCallback = object : AudioDeviceCallback() {
308
311
  override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>?) {
309
312
  emitAudioDevicesChanged()
310
313
  }
@@ -314,6 +317,7 @@ object CallEngine {
314
317
  }
315
318
 
316
319
  fun registerAudioDeviceCallback(context: Context) {
320
+ appContext = context.applicationContext
317
321
  audioManager = audioManager ?: context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
318
322
  audioManager?.registerAudioDeviceCallback(audioDeviceCallback, null)
319
323
  }
@@ -324,7 +328,8 @@ object CallEngine {
324
328
  }
325
329
 
326
330
  fun emitAudioDevicesChanged() {
327
- val devices = getAudioDevices(audioManager!!.context)
331
+ val context = appContext ?: return
332
+ val devices = getAudioDevices(context)
328
333
  val json = JSONObject().put("devices", JSONArray(devices))
329
334
  emitEvent(CallEventType.AUDIO_DEVICES_CHANGED, json)
330
335
  }
@@ -385,4 +390,24 @@ object CallEngine {
385
390
  PHONE_ACCOUNT_ID
386
391
  )
387
392
  }
393
+
394
+ fun playRingtone(context: Context) {
395
+ try {
396
+ Log.d(TAG, "Playing ringtone")
397
+ val uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
398
+ ringtone = RingtoneManager.getRingtone(context, uri)
399
+ ringtone?.audioAttributes = AudioAttributes.Builder()
400
+ .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
401
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
402
+ .build()
403
+ ringtone?.play()
404
+ } catch (e: Exception) {
405
+ Log.e(TAG, "Failed to play ringtone: ${e.message}")
406
+ }
407
+ }
408
+
409
+ fun stopRingtone() {
410
+ try { ringtone?.stop() } catch (_: Exception) {}
411
+ ringtone = null
412
+ }
388
413
  }
@@ -56,7 +56,7 @@ class MyConnection(
56
56
  } else {
57
57
  CallEngine.unmuteCall(context, callData)
58
58
  }
59
- // Do NOT emit audio devices changed here; only emit route change
59
+ // Only emit route change, not device list
60
60
  CallEngine.emitEvent(
61
61
  CallEventType.AUDIO_ROUTE_CHANGED,
62
62
  org.json.JSONObject().put("route", state.route)
@@ -2,5 +2,19 @@
2
2
 
3
3
  // NativeCallManager.ts
4
4
  import { TurboModuleRegistry } from 'react-native';
5
+ export let CallEventType = /*#__PURE__*/function (CallEventType) {
6
+ CallEventType["INITIAL_CALL_STATE"] = "INITIAL_CALL_STATE";
7
+ CallEventType["CALL_STATE_CHANGED"] = "CALL_STATE_CHANGED";
8
+ CallEventType["AUDIO_DEVICES_CHANGED"] = "AUDIO_DEVICES_CHANGED";
9
+ CallEventType["AUDIO_ROUTE_CHANGED"] = "AUDIO_ROUTE_CHANGED";
10
+ CallEventType["CALL_HELD"] = "CALL_HELD";
11
+ CallEventType["CALL_UNHELD"] = "CALL_UNHELD";
12
+ CallEventType["CALL_MUTED"] = "CALL_MUTED";
13
+ CallEventType["CALL_UNMUTED"] = "CALL_UNMUTED";
14
+ CallEventType["CALL_ANSWERED"] = "CALL_ANSWERED";
15
+ CallEventType["CALL_REJECTED"] = "CALL_REJECTED";
16
+ CallEventType["CALL_ENDED"] = "CALL_ENDED";
17
+ return CallEventType;
18
+ }({});
5
19
  export default TurboModuleRegistry.getEnforcing('CallManager');
6
20
  //# sourceMappingURL=NativeCallManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"..\\..\\src","sources":["NativeCallManager.ts"],"mappings":";;AAAA;AACA,SAA2BA,mBAAmB,QAAQ,cAAc;AAgBpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,aAAa,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["TurboModuleRegistry","CallEventType","getEnforcing"],"sourceRoot":"..\\..\\src","sources":["NativeCallManager.ts"],"mappings":";;AAAA;AACA,SAA2BA,mBAAmB,QAAQ,cAAc;AAEpE,WAAYC,aAAa,0BAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAbA,aAAa;EAAA,OAAbA,aAAa;AAAA;AA4BzB,eAAeD,mBAAmB,CAACE,YAAY,CAAO,aAAa,CAAC","ignoreList":[]}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ // index.tsx
3
4
  import CallManager from "./NativeCallManager.js";
4
5
  export const reportIncomingCall = CallManager.reportIncomingCall;
5
6
  export const endCall = CallManager.endCall;
@@ -1 +1 @@
1
- {"version":3,"names":["CallManager","reportIncomingCall","endCall","answerCall","silenceRingtone","rejectCurrentAndAnswerNew","setEventHandler","getAudioDevices","setAudioRoute","keepScreenAwake"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,WAAW,MAAM,wBAAqB;AAG7C,OAAO,MAAMC,kBAAkB,GAAGD,WAAW,CAACC,kBAAkB;AAChE,OAAO,MAAMC,OAAO,GAAGF,WAAW,CAACE,OAAO;AAC1C,OAAO,MAAMC,UAAU,GAAGH,WAAW,CAACG,UAAU;AAChD,OAAO,MAAMC,eAAe,GAAGJ,WAAW,CAACI,eAAe;AAC1D,OAAO,MAAMC,yBAAyB,GAAGL,WAAW,CAACK,yBAAyB;AAC9E,OAAO,MAAMC,eAAe,GAAGN,WAAW,CAACM,eAAe;AAE1D,OAAO,MAAMC,eAAe,GAAGP,WAAW,CAACO,eAAe;AAC1D,OAAO,MAAMC,aAAa,GAAGR,WAAW,CAACQ,aAAa;AACtD,OAAO,MAAMC,eAAe,GAAGT,WAAW,CAACS,eAAe","ignoreList":[]}
1
+ {"version":3,"names":["CallManager","reportIncomingCall","endCall","answerCall","silenceRingtone","rejectCurrentAndAnswerNew","setEventHandler","getAudioDevices","setAudioRoute","keepScreenAwake"],"sourceRoot":"..\\..\\src","sources":["index.tsx"],"mappings":";;AAAA;AACA,OAAOA,WAAW,MAAM,wBAAqB;AAG7C,OAAO,MAAMC,kBAAkB,GAAGD,WAAW,CAACC,kBAAkB;AAChE,OAAO,MAAMC,OAAO,GAAGF,WAAW,CAACE,OAAO;AAC1C,OAAO,MAAMC,UAAU,GAAGH,WAAW,CAACG,UAAU;AAChD,OAAO,MAAMC,eAAe,GAAGJ,WAAW,CAACI,eAAe;AAC1D,OAAO,MAAMC,yBAAyB,GAAGL,WAAW,CAACK,yBAAyB;AAC9E,OAAO,MAAMC,eAAe,GAAGN,WAAW,CAACM,eAAe;AAC1D,OAAO,MAAMC,eAAe,GAAGP,WAAW,CAACO,eAAe;AAC1D,OAAO,MAAMC,aAAa,GAAGR,WAAW,CAACQ,aAAa;AACtD,OAAO,MAAMC,eAAe,GAAGT,WAAW,CAACS,eAAe","ignoreList":[]}
@@ -1,11 +1,24 @@
1
1
  import { type TurboModule } from 'react-native';
2
+ export declare enum CallEventType {
3
+ INITIAL_CALL_STATE = "INITIAL_CALL_STATE",
4
+ CALL_STATE_CHANGED = "CALL_STATE_CHANGED",
5
+ AUDIO_DEVICES_CHANGED = "AUDIO_DEVICES_CHANGED",
6
+ AUDIO_ROUTE_CHANGED = "AUDIO_ROUTE_CHANGED",
7
+ CALL_HELD = "CALL_HELD",
8
+ CALL_UNHELD = "CALL_UNHELD",
9
+ CALL_MUTED = "CALL_MUTED",
10
+ CALL_UNMUTED = "CALL_UNMUTED",
11
+ CALL_ANSWERED = "CALL_ANSWERED",
12
+ CALL_REJECTED = "CALL_REJECTED",
13
+ CALL_ENDED = "CALL_ENDED"
14
+ }
2
15
  export interface Spec extends TurboModule {
3
16
  reportIncomingCall(callId: string, callData: string): void;
4
17
  endCall(callId: string): void;
5
18
  answerCall(callId: string): void;
6
19
  silenceRingtone(): void;
7
20
  rejectCurrentAndAnswerNew(callId: string, callData: string): void;
8
- setEventHandler(callback: (event: string, callData: string) => void): void;
21
+ setEventHandler(callback: (event: CallEventType, callData: string) => void): void;
9
22
  getAudioDevices(): string[];
10
23
  setAudioRoute(route: string): void;
11
24
  keepScreenAwake(keepAwake: boolean): void;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeCallManager.d.ts","sourceRoot":"","sources":["../../../src/NativeCallManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,IAAI,IAAI,CAAC;IACxB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAClE,eAAe,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAG3E,eAAe,IAAI,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3C;;AAED,wBAAqE"}
1
+ {"version":3,"file":"NativeCallManager.d.ts","sourceRoot":"","sources":["../../../src/NativeCallManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,cAAc,CAAC;AAErE,oBAAY,aAAa;IACvB,kBAAkB,uBAAuB;IACzC,kBAAkB,uBAAuB;IACzC,qBAAqB,0BAA0B;IAC/C,mBAAmB,wBAAwB;IAC3C,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,IAAI,IAAI,CAAC;IACxB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAClE,eAAe,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAGlF,eAAe,IAAI,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3C;;AAED,wBAAqE"}
@@ -1,10 +1,12 @@
1
+ import type { CallEventType } from './NativeCallManager';
1
2
  export declare const reportIncomingCall: (callId: string, callData: string) => void;
2
3
  export declare const endCall: (callId: string) => void;
3
4
  export declare const answerCall: (callId: string) => void;
4
5
  export declare const silenceRingtone: () => void;
5
6
  export declare const rejectCurrentAndAnswerNew: (callId: string, callData: string) => void;
6
- export declare const setEventHandler: (callback: (event: string, callData: string) => void) => void;
7
+ export declare const setEventHandler: (callback: (event: CallEventType, callData: string) => void) => void;
7
8
  export declare const getAudioDevices: () => string[];
8
9
  export declare const setAudioRoute: (route: string) => void;
9
10
  export declare const keepScreenAwake: (keepAwake: boolean) => void;
11
+ export type { CallEventType };
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,4CAAiC,CAAC;AACjE,eAAO,MAAM,OAAO,0BAAsB,CAAC;AAC3C,eAAO,MAAM,UAAU,0BAAyB,CAAC;AACjD,eAAO,MAAM,eAAe,YAA8B,CAAC;AAC3D,eAAO,MAAM,yBAAyB,4CAAwC,CAAC;AAC/E,eAAO,MAAM,eAAe,+DAA8B,CAAC;AAE3D,eAAO,MAAM,eAAe,gBAA8B,CAAC;AAC3D,eAAO,MAAM,aAAa,yBAA4B,CAAC;AACvD,eAAO,MAAM,eAAe,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,eAAO,MAAM,kBAAkB,4CAAiC,CAAC;AACjE,eAAO,MAAM,OAAO,0BAAsB,CAAC;AAC3C,eAAO,MAAM,UAAU,0BAAyB,CAAC;AACjD,eAAO,MAAM,eAAe,YAA8B,CAAC;AAC3D,eAAO,MAAM,yBAAyB,4CAAwC,CAAC;AAC/E,eAAO,MAAM,eAAe,sEAA8B,CAAC;AAC3D,eAAO,MAAM,eAAe,gBAA8B,CAAC;AAC3D,eAAO,MAAM,aAAa,yBAA4B,CAAC;AACvD,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D,YAAY,EAAE,aAAa,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qusaieilouti99/call-manager",
3
- "version": "0.1.26",
3
+ "version": "0.1.28",
4
4
  "description": "call manager",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -1,13 +1,27 @@
1
1
  // NativeCallManager.ts
2
2
  import { type TurboModule, TurboModuleRegistry } from 'react-native';
3
3
 
4
+ export enum CallEventType {
5
+ INITIAL_CALL_STATE = 'INITIAL_CALL_STATE',
6
+ CALL_STATE_CHANGED = 'CALL_STATE_CHANGED',
7
+ AUDIO_DEVICES_CHANGED = 'AUDIO_DEVICES_CHANGED',
8
+ AUDIO_ROUTE_CHANGED = 'AUDIO_ROUTE_CHANGED',
9
+ CALL_HELD = 'CALL_HELD',
10
+ CALL_UNHELD = 'CALL_UNHELD',
11
+ CALL_MUTED = 'CALL_MUTED',
12
+ CALL_UNMUTED = 'CALL_UNMUTED',
13
+ CALL_ANSWERED = 'CALL_ANSWERED',
14
+ CALL_REJECTED = 'CALL_REJECTED',
15
+ CALL_ENDED = 'CALL_ENDED',
16
+ }
17
+
4
18
  export interface Spec extends TurboModule {
5
19
  reportIncomingCall(callId: string, callData: string): void;
6
20
  endCall(callId: string): void;
7
21
  answerCall(callId: string): void;
8
22
  silenceRingtone(): void;
9
23
  rejectCurrentAndAnswerNew(callId: string, callData: string): void;
10
- setEventHandler(callback: (event: string, callData: string) => void): void;
24
+ setEventHandler(callback: (event: CallEventType, callData: string) => void): void;
11
25
 
12
26
  // JSI-native audio/device/screen APIs:
13
27
  getAudioDevices(): string[];
package/src/index.tsx CHANGED
@@ -1,5 +1,6 @@
1
+ // index.tsx
1
2
  import CallManager from './NativeCallManager';
2
-
3
+ import type { CallEventType } from './NativeCallManager';
3
4
 
4
5
  export const reportIncomingCall = CallManager.reportIncomingCall;
5
6
  export const endCall = CallManager.endCall;
@@ -7,7 +8,8 @@ export const answerCall = CallManager.answerCall;
7
8
  export const silenceRingtone = CallManager.silenceRingtone;
8
9
  export const rejectCurrentAndAnswerNew = CallManager.rejectCurrentAndAnswerNew;
9
10
  export const setEventHandler = CallManager.setEventHandler;
10
-
11
11
  export const getAudioDevices = CallManager.getAudioDevices;
12
12
  export const setAudioRoute = CallManager.setAudioRoute;
13
13
  export const keepScreenAwake = CallManager.keepScreenAwake;
14
+
15
+ export type { CallEventType };