@qusaieilouti99/call-manager 0.1.26 → 0.1.27

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.
@@ -30,6 +30,7 @@ object CallEngine {
30
30
  private var ringtone: android.media.Ringtone? = null
31
31
  private var audioManager: AudioManager? = null
32
32
  private var wakeLock: PowerManager.WakeLock? = null
33
+ private var appContext: Context? = null
33
34
 
34
35
  // --- Multi-call state ---
35
36
  private val activeCalls = ConcurrentHashMap<String, CallInfo>() // callId -> CallInfo
@@ -78,6 +79,7 @@ object CallEngine {
78
79
  }
79
80
 
80
81
  fun reportIncomingCall(context: Context, callId: String, callData: String) {
82
+ appContext = context.applicationContext
81
83
  Log.d(TAG, "reportIncomingCall: $callId, $callData")
82
84
  val callerName = try {
83
85
  val json = JSONObject(callData)
@@ -314,6 +316,7 @@ object CallEngine {
314
316
  }
315
317
 
316
318
  fun registerAudioDeviceCallback(context: Context) {
319
+ appContext = context.applicationContext
317
320
  audioManager = audioManager ?: context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
318
321
  audioManager?.registerAudioDeviceCallback(audioDeviceCallback, null)
319
322
  }
@@ -324,7 +327,8 @@ object CallEngine {
324
327
  }
325
328
 
326
329
  fun emitAudioDevicesChanged() {
327
- val devices = getAudioDevices(audioManager!!.context)
330
+ val context = appContext ?: return
331
+ val devices = getAudioDevices(context)
328
332
  val json = JSONObject().put("devices", JSONArray(devices))
329
333
  emitEvent(CallEventType.AUDIO_DEVICES_CHANGED, json)
330
334
  }
@@ -385,4 +389,24 @@ object CallEngine {
385
389
  PHONE_ACCOUNT_ID
386
390
  )
387
391
  }
392
+
393
+ fun playRingtone(context: Context) {
394
+ try {
395
+ Log.d(TAG, "Playing ringtone")
396
+ val uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
397
+ ringtone = RingtoneManager.getRingtone(context, uri)
398
+ ringtone?.audioAttributes = AudioAttributes.Builder()
399
+ .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
400
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
401
+ .build()
402
+ ringtone?.play()
403
+ } catch (e: Exception) {
404
+ Log.e(TAG, "Failed to play ringtone: ${e.message}")
405
+ }
406
+ }
407
+
408
+ fun stopRingtone() {
409
+ try { ringtone?.stop() } catch (_: Exception) {}
410
+ ringtone = null
411
+ }
388
412
  }
@@ -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.27",
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 };