@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.
- package/android/src/main/java/com/qusaieilouti99/callmanager/CallEngine.kt +27 -2
- package/android/src/main/java/com/qusaieilouti99/callmanager/MyConnection.kt +1 -1
- package/lib/module/NativeCallManager.js +14 -0
- package/lib/module/NativeCallManager.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/NativeCallManager.d.ts +14 -1
- package/lib/typescript/src/NativeCallManager.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +3 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/NativeCallManager.ts +15 -1
- package/src/index.tsx +4 -2
|
@@ -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 :
|
|
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
|
|
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
|
-
//
|
|
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;
|
|
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":[]}
|
package/lib/module/index.js
CHANGED
package/lib/module/index.js.map
CHANGED
|
@@ -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;
|
|
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:
|
|
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,
|
|
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:
|
|
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":"
|
|
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
package/src/NativeCallManager.ts
CHANGED
|
@@ -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:
|
|
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 };
|