@kaleem766/react-native-incoming-call 0.1.0
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/IncomingCall.podspec +29 -0
- package/LICENSE +20 -0
- package/README.md +280 -0
- package/android/CMakeLists.txt +24 -0
- package/android/build.gradle +118 -0
- package/android/src/main/AndroidManifest.xml +35 -0
- package/android/src/main/cpp/cpp-adapter.cpp +6 -0
- package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCall.kt +219 -0
- package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCallActivity.kt +314 -0
- package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCallModule.kt +152 -0
- package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCallPackage.kt +31 -0
- package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCallService.kt +109 -0
- package/ios/IncomingCall.swift +28 -0
- package/lib/module/IncomingCall.nitro.js +4 -0
- package/lib/module/IncomingCall.nitro.js.map +1 -0
- package/lib/module/index.js +137 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/IncomingCall.nitro.d.ts +21 -0
- package/lib/typescript/src/IncomingCall.nitro.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +43 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/nitro.json +17 -0
- package/nitrogen/generated/android/c++/JHybridIncomingCallSpec.cpp +101 -0
- package/nitrogen/generated/android/c++/JHybridIncomingCallSpec.hpp +73 -0
- package/nitrogen/generated/android/c++/views/JHybridIncomingCallStateUpdater.cpp +72 -0
- package/nitrogen/generated/android/c++/views/JHybridIncomingCallStateUpdater.hpp +49 -0
- package/nitrogen/generated/android/incomingcall+autolinking.cmake +83 -0
- package/nitrogen/generated/android/incomingcall+autolinking.gradle +27 -0
- package/nitrogen/generated/android/incomingcallOnLoad.cpp +56 -0
- package/nitrogen/generated/android/incomingcallOnLoad.hpp +34 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/incomingcall/HybridIncomingCallSpec.kt +87 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/incomingcall/incomingcallOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/incomingcall/views/HybridIncomingCallManager.kt +70 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/incomingcall/views/HybridIncomingCallStateUpdater.kt +23 -0
- package/nitrogen/generated/ios/IncomingCall+autolinking.rb +60 -0
- package/nitrogen/generated/ios/IncomingCall-Swift-Cxx-Bridge.cpp +33 -0
- package/nitrogen/generated/ios/IncomingCall-Swift-Cxx-Bridge.hpp +83 -0
- package/nitrogen/generated/ios/IncomingCall-Swift-Cxx-Umbrella.hpp +45 -0
- package/nitrogen/generated/ios/IncomingCallAutolinking.mm +33 -0
- package/nitrogen/generated/ios/IncomingCallAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridIncomingCallSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridIncomingCallSpecSwift.hpp +121 -0
- package/nitrogen/generated/ios/c++/views/HybridIncomingCallComponent.mm +127 -0
- package/nitrogen/generated/ios/swift/HybridIncomingCallSpec.swift +60 -0
- package/nitrogen/generated/ios/swift/HybridIncomingCallSpec_cxx.swift +270 -0
- package/nitrogen/generated/shared/c++/HybridIncomingCallSpec.cpp +32 -0
- package/nitrogen/generated/shared/c++/HybridIncomingCallSpec.hpp +73 -0
- package/nitrogen/generated/shared/c++/views/HybridIncomingCallComponent.cpp +127 -0
- package/nitrogen/generated/shared/c++/views/HybridIncomingCallComponent.hpp +115 -0
- package/nitrogen/generated/shared/json/IncomingCallConfig.json +14 -0
- package/package.json +180 -0
- package/src/IncomingCall.nitro.ts +27 -0
- package/src/index.tsx +173 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package com.margelo.nitro.incomingcall
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.BaseReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
7
|
+
import com.facebook.react.uimanager.ViewManager
|
|
8
|
+
|
|
9
|
+
import com.margelo.nitro.incomingcall.views.HybridIncomingCallManager
|
|
10
|
+
|
|
11
|
+
class IncomingCallPackage : BaseReactPackage() {
|
|
12
|
+
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
13
|
+
return if (name == IncomingCallModule.MODULE_NAME) {
|
|
14
|
+
IncomingCallModule(reactContext)
|
|
15
|
+
} else null
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
|
|
19
|
+
return ReactModuleInfoProvider { HashMap() }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|
|
23
|
+
return listOf(HybridIncomingCallManager())
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
companion object {
|
|
27
|
+
init {
|
|
28
|
+
System.loadLibrary("incomingcall")
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
package com.margelo.nitro.incomingcall
|
|
2
|
+
|
|
3
|
+
import android.app.Notification
|
|
4
|
+
import android.app.NotificationChannel
|
|
5
|
+
import android.app.NotificationManager
|
|
6
|
+
import android.app.PendingIntent
|
|
7
|
+
import android.app.Service
|
|
8
|
+
import android.content.Intent
|
|
9
|
+
import android.os.Build
|
|
10
|
+
import android.os.IBinder
|
|
11
|
+
import androidx.core.app.NotificationCompat
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Foreground service that keeps the incoming call alive when the app is in the
|
|
15
|
+
* background or in the killed state. It immediately starts [IncomingCallActivity]
|
|
16
|
+
* so the full-screen UI appears above the lock screen.
|
|
17
|
+
*/
|
|
18
|
+
class IncomingCallService : Service() {
|
|
19
|
+
|
|
20
|
+
companion object {
|
|
21
|
+
private const val CHANNEL_ID = "incoming_call_channel"
|
|
22
|
+
private const val NOTIFICATION_ID = 1001
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override fun onBind(intent: Intent?): IBinder? = null
|
|
26
|
+
|
|
27
|
+
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
|
28
|
+
val uuid = intent?.getStringExtra("uuid") ?: ""
|
|
29
|
+
val callerName = intent?.getStringExtra("callerName") ?: "Unknown"
|
|
30
|
+
val avatar = intent?.getStringExtra("avatar")
|
|
31
|
+
val backgroundColor = intent?.getStringExtra("backgroundColor")
|
|
32
|
+
val callType = intent?.getStringExtra("callType") ?: "audio"
|
|
33
|
+
val timeout = intent?.getLongExtra("timeout", 30000L) ?: 30000L
|
|
34
|
+
|
|
35
|
+
createNotificationChannel()
|
|
36
|
+
startForeground(NOTIFICATION_ID, buildNotification(callerName, uuid))
|
|
37
|
+
|
|
38
|
+
// Launch full-screen incoming call activity
|
|
39
|
+
val activityIntent = Intent(this, IncomingCallActivity::class.java).apply {
|
|
40
|
+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
|
41
|
+
putExtra("uuid", uuid)
|
|
42
|
+
putExtra("callerName", callerName)
|
|
43
|
+
putExtra("avatar", avatar)
|
|
44
|
+
putExtra("backgroundColor", backgroundColor)
|
|
45
|
+
putExtra("callType", callType)
|
|
46
|
+
putExtra("timeout", timeout)
|
|
47
|
+
}
|
|
48
|
+
startActivity(activityIntent)
|
|
49
|
+
|
|
50
|
+
return START_NOT_STICKY
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
override fun onDestroy() {
|
|
54
|
+
super.onDestroy()
|
|
55
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
56
|
+
stopForeground(STOP_FOREGROUND_REMOVE)
|
|
57
|
+
} else {
|
|
58
|
+
@Suppress("DEPRECATION")
|
|
59
|
+
stopForeground(true)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
64
|
+
// Notification helpers
|
|
65
|
+
// ──────────────────────────────────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
private fun createNotificationChannel() {
|
|
68
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
69
|
+
val channel = NotificationChannel(
|
|
70
|
+
CHANNEL_ID,
|
|
71
|
+
"Incoming Calls",
|
|
72
|
+
NotificationManager.IMPORTANCE_HIGH
|
|
73
|
+
).apply {
|
|
74
|
+
description = "Displays incoming call alerts"
|
|
75
|
+
setSound(null, null)
|
|
76
|
+
setBypassDnd(true)
|
|
77
|
+
lockscreenVisibility = Notification.VISIBILITY_PUBLIC
|
|
78
|
+
}
|
|
79
|
+
val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
|
|
80
|
+
manager.createNotificationChannel(channel)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private fun buildNotification(callerName: String, uuid: String): Notification {
|
|
85
|
+
// Full-screen intent so the activity shows on the lock screen
|
|
86
|
+
val fullScreenIntent = Intent(this, IncomingCallActivity::class.java).apply {
|
|
87
|
+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
|
|
88
|
+
putExtra("uuid", uuid)
|
|
89
|
+
putExtra("callerName", callerName)
|
|
90
|
+
}
|
|
91
|
+
val fullScreenPendingIntent = PendingIntent.getActivity(
|
|
92
|
+
this,
|
|
93
|
+
0,
|
|
94
|
+
fullScreenIntent,
|
|
95
|
+
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
return NotificationCompat.Builder(this, CHANNEL_ID)
|
|
99
|
+
.setContentTitle("Incoming Call")
|
|
100
|
+
.setContentText(callerName)
|
|
101
|
+
.setSmallIcon(android.R.drawable.ic_menu_call)
|
|
102
|
+
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
|
103
|
+
.setCategory(NotificationCompat.CATEGORY_CALL)
|
|
104
|
+
.setOngoing(true)
|
|
105
|
+
.setAutoCancel(false)
|
|
106
|
+
.setFullScreenIntent(fullScreenPendingIntent, true)
|
|
107
|
+
.build()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class HybridIncomingCall : HybridIncomingCallSpec {
|
|
2
|
+
|
|
3
|
+
// UIView
|
|
4
|
+
var view: UIView = UIView()
|
|
5
|
+
|
|
6
|
+
// props
|
|
7
|
+
var color: String = "#000" {
|
|
8
|
+
didSet {
|
|
9
|
+
view.backgroundColor = hexStringToUIColor(hexColor: color)
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
func hexStringToUIColor(hexColor: String) -> UIColor {
|
|
14
|
+
let stringScanner = Scanner(string: hexColor)
|
|
15
|
+
|
|
16
|
+
if(hexColor.hasPrefix("#")) {
|
|
17
|
+
stringScanner.scanLocation = 1
|
|
18
|
+
}
|
|
19
|
+
var color: UInt32 = 0
|
|
20
|
+
stringScanner.scanHexInt32(&color)
|
|
21
|
+
|
|
22
|
+
let r = CGFloat(Int(color >> 16) & 0x000000FF)
|
|
23
|
+
let g = CGFloat(Int(color >> 8) & 0x000000FF)
|
|
24
|
+
let b = CGFloat(Int(color) & 0x000000FF)
|
|
25
|
+
|
|
26
|
+
return UIColor(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: 1)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["IncomingCall.nitro.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { getHostComponent } from 'react-native-nitro-modules';
|
|
4
|
+
import { NativeModules, NativeEventEmitter, Platform } from 'react-native';
|
|
5
|
+
const IncomingCallConfig = require('../nitrogen/generated/shared/json/IncomingCallConfig.json');
|
|
6
|
+
export const IncomingCallView = getHostComponent('IncomingCall', () => IncomingCallConfig);
|
|
7
|
+
|
|
8
|
+
// Types for the API
|
|
9
|
+
|
|
10
|
+
// Event emitter for handling incoming call events
|
|
11
|
+
class IncomingCallEventManager {
|
|
12
|
+
listeners = new Map();
|
|
13
|
+
constructor() {
|
|
14
|
+
if (Platform.OS === 'android' && NativeModules.IncomingCallModule) {
|
|
15
|
+
this.eventEmitter = new NativeEventEmitter(NativeModules.IncomingCallModule);
|
|
16
|
+
this.setupNativeListeners();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
setupNativeListeners() {
|
|
20
|
+
if (!this.eventEmitter) return;
|
|
21
|
+
this.eventEmitter.addListener('onAnswer', data => {
|
|
22
|
+
this.emit('onAnswer', data);
|
|
23
|
+
});
|
|
24
|
+
this.eventEmitter.addListener('onReject', data => {
|
|
25
|
+
this.emit('onReject', data);
|
|
26
|
+
});
|
|
27
|
+
this.eventEmitter.addListener('onTimeout', data => {
|
|
28
|
+
this.emit('onTimeout', data);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
emit(event, data) {
|
|
32
|
+
const listeners = this.listeners.get(event);
|
|
33
|
+
if (listeners) {
|
|
34
|
+
listeners.forEach(listener => listener(data));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
addEventListener(event, listener) {
|
|
38
|
+
if (!this.listeners.has(event)) {
|
|
39
|
+
this.listeners.set(event, new Set());
|
|
40
|
+
}
|
|
41
|
+
this.listeners.get(event).add(listener);
|
|
42
|
+
|
|
43
|
+
// Return unsubscribe function
|
|
44
|
+
return () => {
|
|
45
|
+
this.listeners.get(event)?.delete(listener);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
removeEventListener(event, listener) {
|
|
49
|
+
this.listeners.get(event)?.delete(listener);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const eventManager = new IncomingCallEventManager();
|
|
53
|
+
|
|
54
|
+
// Main API class
|
|
55
|
+
export class IncomingCall {
|
|
56
|
+
/**
|
|
57
|
+
* Display an incoming call screen
|
|
58
|
+
*/
|
|
59
|
+
static async display(options) {
|
|
60
|
+
try {
|
|
61
|
+
if (Platform.OS === 'android' && NativeModules.IncomingCallModule) {
|
|
62
|
+
return await NativeModules.IncomingCallModule.displayIncomingCall(options);
|
|
63
|
+
} else {
|
|
64
|
+
console.warn('IncomingCall: Native module not available');
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error('IncomingCall: Failed to display call', error);
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Answer the current incoming call
|
|
74
|
+
*/
|
|
75
|
+
static async answer(uuid) {
|
|
76
|
+
try {
|
|
77
|
+
if (Platform.OS === 'android' && NativeModules.IncomingCallModule) {
|
|
78
|
+
return await NativeModules.IncomingCallModule.answerCall(uuid);
|
|
79
|
+
} else {
|
|
80
|
+
console.warn('IncomingCall: Native module not available');
|
|
81
|
+
}
|
|
82
|
+
} catch (error) {
|
|
83
|
+
console.error('IncomingCall: Failed to answer call', error);
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Reject the current incoming call
|
|
90
|
+
*/
|
|
91
|
+
static async reject(uuid) {
|
|
92
|
+
try {
|
|
93
|
+
if (Platform.OS === 'android' && NativeModules.IncomingCallModule) {
|
|
94
|
+
return await NativeModules.IncomingCallModule.rejectCall(uuid);
|
|
95
|
+
} else {
|
|
96
|
+
console.warn('IncomingCall: Native module not available');
|
|
97
|
+
}
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.error('IncomingCall: Failed to reject call', error);
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* End an ongoing call
|
|
106
|
+
*/
|
|
107
|
+
static async end(uuid) {
|
|
108
|
+
try {
|
|
109
|
+
if (Platform.OS === 'android' && NativeModules.IncomingCallModule) {
|
|
110
|
+
return await NativeModules.IncomingCallModule.endCall(uuid);
|
|
111
|
+
} else {
|
|
112
|
+
console.warn('IncomingCall: Native module not available');
|
|
113
|
+
}
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.error('IncomingCall: Failed to end call', error);
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Add event listener for call events
|
|
122
|
+
*/
|
|
123
|
+
static addEventListener(event, listener) {
|
|
124
|
+
return eventManager.addEventListener(event, listener);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Remove event listener for call events
|
|
129
|
+
*/
|
|
130
|
+
static removeEventListener(event, listener) {
|
|
131
|
+
eventManager.removeEventListener(event, listener);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Default export
|
|
136
|
+
export default IncomingCall;
|
|
137
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getHostComponent","NativeModules","NativeEventEmitter","Platform","IncomingCallConfig","require","IncomingCallView","IncomingCallEventManager","listeners","Map","constructor","OS","IncomingCallModule","eventEmitter","setupNativeListeners","addListener","data","emit","event","get","forEach","listener","addEventListener","has","set","Set","add","delete","removeEventListener","eventManager","IncomingCall","display","options","displayIncomingCall","console","warn","error","answer","uuid","answerCall","reject","rejectCall","end","endCall"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { HybridView, HybridViewMethods, HybridViewProps } from 'react-native-nitro-modules';
|
|
2
|
+
export interface IncomingCallProps extends HybridViewProps {
|
|
3
|
+
/** Background color of the call screen (CSS hex, e.g. "#1A1A2E") */
|
|
4
|
+
color: string;
|
|
5
|
+
/** Caller's display name */
|
|
6
|
+
callerName?: string;
|
|
7
|
+
/** Remote avatar URL */
|
|
8
|
+
avatar?: string;
|
|
9
|
+
/** "audio" | "video" – defaults to "audio" */
|
|
10
|
+
callType?: string;
|
|
11
|
+
/** Auto-reject timeout in milliseconds – defaults to 30000 */
|
|
12
|
+
timeout?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface IncomingCallMethods extends HybridViewMethods {
|
|
15
|
+
/** Programmatically answer the call rendered in this view */
|
|
16
|
+
answerCall(): void;
|
|
17
|
+
/** Programmatically reject the call rendered in this view */
|
|
18
|
+
rejectCall(): void;
|
|
19
|
+
}
|
|
20
|
+
export type IncomingCall = HybridView<IncomingCallProps, IncomingCallMethods>;
|
|
21
|
+
//# sourceMappingURL=IncomingCall.nitro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncomingCall.nitro.d.ts","sourceRoot":"","sources":["../../../src/IncomingCall.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,eAAe,EAChB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,6DAA6D;IAC7D,UAAU,IAAI,IAAI,CAAC;IACnB,6DAA6D;IAC7D,UAAU,IAAI,IAAI,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { IncomingCallMethods, IncomingCallProps } from './IncomingCall.nitro';
|
|
2
|
+
export declare const IncomingCallView: import("react-native-nitro-modules").ReactNativeView<IncomingCallProps, IncomingCallMethods>;
|
|
3
|
+
export interface IncomingCallDisplayOptions {
|
|
4
|
+
uuid: string;
|
|
5
|
+
callerName: string;
|
|
6
|
+
avatar?: string;
|
|
7
|
+
callType?: 'audio' | 'video';
|
|
8
|
+
backgroundColor?: string;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
}
|
|
11
|
+
export type IncomingCallEventType = 'onAnswer' | 'onReject' | 'onTimeout';
|
|
12
|
+
export interface IncomingCallEventData {
|
|
13
|
+
uuid: string;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class IncomingCall {
|
|
17
|
+
/**
|
|
18
|
+
* Display an incoming call screen
|
|
19
|
+
*/
|
|
20
|
+
static display(options: IncomingCallDisplayOptions): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Answer the current incoming call
|
|
23
|
+
*/
|
|
24
|
+
static answer(uuid: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Reject the current incoming call
|
|
27
|
+
*/
|
|
28
|
+
static reject(uuid: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* End an ongoing call
|
|
31
|
+
*/
|
|
32
|
+
static end(uuid: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Add event listener for call events
|
|
35
|
+
*/
|
|
36
|
+
static addEventListener(event: IncomingCallEventType, listener: (data: IncomingCallEventData) => void): () => void;
|
|
37
|
+
/**
|
|
38
|
+
* Remove event listener for call events
|
|
39
|
+
*/
|
|
40
|
+
static removeEventListener(event: IncomingCallEventType, listener: (data: IncomingCallEventData) => void): void;
|
|
41
|
+
}
|
|
42
|
+
export default IncomingCall;
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAE9B,eAAO,MAAM,gBAAgB,8FAGc,CAAC;AAG5C,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAyDD,qBAAa,YAAY;IACvB;;OAEG;WACU,OAAO,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxE;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD;;OAEG;WACU,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C;;OAEG;IACH,MAAM,CAAC,gBAAgB,CACrB,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,GAC9C,MAAM,IAAI;IAIb;;OAEG;IACH,MAAM,CAAC,mBAAmB,CACxB,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,GAC9C,IAAI;CAGR;AAGD,eAAe,YAAY,CAAC"}
|
package/nitro.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cxxNamespace": ["incomingcall"],
|
|
3
|
+
"ios": {
|
|
4
|
+
"iosModuleName": "IncomingCall"
|
|
5
|
+
},
|
|
6
|
+
"android": {
|
|
7
|
+
"androidNamespace": ["incomingcall"],
|
|
8
|
+
"androidCxxLibName": "incomingcall"
|
|
9
|
+
},
|
|
10
|
+
"autolinking": {
|
|
11
|
+
"IncomingCall": {
|
|
12
|
+
"swift": "HybridIncomingCall",
|
|
13
|
+
"kotlin": "HybridIncomingCall"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"ignorePaths": ["node_modules"]
|
|
17
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// JHybridIncomingCallSpec.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include "JHybridIncomingCallSpec.hpp"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
#include <string>
|
|
13
|
+
#include <optional>
|
|
14
|
+
|
|
15
|
+
namespace margelo::nitro::incomingcall {
|
|
16
|
+
|
|
17
|
+
std::shared_ptr<JHybridIncomingCallSpec> JHybridIncomingCallSpec::JavaPart::getJHybridIncomingCallSpec() {
|
|
18
|
+
auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
|
|
19
|
+
auto castHybridObject = std::dynamic_pointer_cast<JHybridIncomingCallSpec>(hybridObject);
|
|
20
|
+
if (castHybridObject == nullptr) [[unlikely]] {
|
|
21
|
+
throw std::runtime_error("Failed to downcast JHybridObject to JHybridIncomingCallSpec!");
|
|
22
|
+
}
|
|
23
|
+
return castHybridObject;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
jni::local_ref<JHybridIncomingCallSpec::CxxPart::jhybriddata> JHybridIncomingCallSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
|
|
27
|
+
return makeCxxInstance(jThis);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
std::shared_ptr<JHybridObject> JHybridIncomingCallSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
|
|
31
|
+
auto castJavaPart = jni::dynamic_ref_cast<JHybridIncomingCallSpec::JavaPart>(javaPart);
|
|
32
|
+
if (castJavaPart == nullptr) [[unlikely]] {
|
|
33
|
+
throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridIncomingCallSpec::JavaPart!");
|
|
34
|
+
}
|
|
35
|
+
return std::make_shared<JHybridIncomingCallSpec>(castJavaPart);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
void JHybridIncomingCallSpec::CxxPart::registerNatives() {
|
|
39
|
+
registerHybrid({
|
|
40
|
+
makeNativeMethod("initHybrid", JHybridIncomingCallSpec::CxxPart::initHybrid),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Properties
|
|
45
|
+
std::string JHybridIncomingCallSpec::getColor() {
|
|
46
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JString>()>("getColor");
|
|
47
|
+
auto __result = method(_javaPart);
|
|
48
|
+
return __result->toStdString();
|
|
49
|
+
}
|
|
50
|
+
void JHybridIncomingCallSpec::setColor(const std::string& color) {
|
|
51
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* color */)>("setColor");
|
|
52
|
+
method(_javaPart, jni::make_jstring(color));
|
|
53
|
+
}
|
|
54
|
+
std::optional<std::string> JHybridIncomingCallSpec::getCallerName() {
|
|
55
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JString>()>("getCallerName");
|
|
56
|
+
auto __result = method(_javaPart);
|
|
57
|
+
return __result != nullptr ? std::make_optional(__result->toStdString()) : std::nullopt;
|
|
58
|
+
}
|
|
59
|
+
void JHybridIncomingCallSpec::setCallerName(const std::optional<std::string>& callerName) {
|
|
60
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* callerName */)>("setCallerName");
|
|
61
|
+
method(_javaPart, callerName.has_value() ? jni::make_jstring(callerName.value()) : nullptr);
|
|
62
|
+
}
|
|
63
|
+
std::optional<std::string> JHybridIncomingCallSpec::getAvatar() {
|
|
64
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JString>()>("getAvatar");
|
|
65
|
+
auto __result = method(_javaPart);
|
|
66
|
+
return __result != nullptr ? std::make_optional(__result->toStdString()) : std::nullopt;
|
|
67
|
+
}
|
|
68
|
+
void JHybridIncomingCallSpec::setAvatar(const std::optional<std::string>& avatar) {
|
|
69
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* avatar */)>("setAvatar");
|
|
70
|
+
method(_javaPart, avatar.has_value() ? jni::make_jstring(avatar.value()) : nullptr);
|
|
71
|
+
}
|
|
72
|
+
std::optional<std::string> JHybridIncomingCallSpec::getCallType() {
|
|
73
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JString>()>("getCallType");
|
|
74
|
+
auto __result = method(_javaPart);
|
|
75
|
+
return __result != nullptr ? std::make_optional(__result->toStdString()) : std::nullopt;
|
|
76
|
+
}
|
|
77
|
+
void JHybridIncomingCallSpec::setCallType(const std::optional<std::string>& callType) {
|
|
78
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* callType */)>("setCallType");
|
|
79
|
+
method(_javaPart, callType.has_value() ? jni::make_jstring(callType.value()) : nullptr);
|
|
80
|
+
}
|
|
81
|
+
std::optional<double> JHybridIncomingCallSpec::getTimeout() {
|
|
82
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<jni::JDouble>()>("getTimeout");
|
|
83
|
+
auto __result = method(_javaPart);
|
|
84
|
+
return __result != nullptr ? std::make_optional(__result->value()) : std::nullopt;
|
|
85
|
+
}
|
|
86
|
+
void JHybridIncomingCallSpec::setTimeout(std::optional<double> timeout) {
|
|
87
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JDouble> /* timeout */)>("setTimeout");
|
|
88
|
+
method(_javaPart, timeout.has_value() ? jni::JDouble::valueOf(timeout.value()) : nullptr);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Methods
|
|
92
|
+
void JHybridIncomingCallSpec::answerCall() {
|
|
93
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void()>("answerCall");
|
|
94
|
+
method(_javaPart);
|
|
95
|
+
}
|
|
96
|
+
void JHybridIncomingCallSpec::rejectCall() {
|
|
97
|
+
static const auto method = _javaPart->javaClassStatic()->getMethod<void()>("rejectCall");
|
|
98
|
+
method(_javaPart);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
} // namespace margelo::nitro::incomingcall
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridIncomingCallSpec.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <NitroModules/JHybridObject.hpp>
|
|
11
|
+
#include <fbjni/fbjni.h>
|
|
12
|
+
#include "HybridIncomingCallSpec.hpp"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
namespace margelo::nitro::incomingcall {
|
|
18
|
+
|
|
19
|
+
using namespace facebook;
|
|
20
|
+
|
|
21
|
+
class JHybridIncomingCallSpec: public virtual HybridIncomingCallSpec, public virtual JHybridObject {
|
|
22
|
+
public:
|
|
23
|
+
struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::JavaPart> {
|
|
24
|
+
static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/incomingcall/HybridIncomingCallSpec;";
|
|
25
|
+
std::shared_ptr<JHybridIncomingCallSpec> getJHybridIncomingCallSpec();
|
|
26
|
+
};
|
|
27
|
+
struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxPart> {
|
|
28
|
+
static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/incomingcall/HybridIncomingCallSpec$CxxPart;";
|
|
29
|
+
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
|
|
30
|
+
static void registerNatives();
|
|
31
|
+
using HybridBase::HybridBase;
|
|
32
|
+
protected:
|
|
33
|
+
std::shared_ptr<JHybridObject> createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) override;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
public:
|
|
37
|
+
explicit JHybridIncomingCallSpec(const jni::local_ref<JHybridIncomingCallSpec::JavaPart>& javaPart):
|
|
38
|
+
HybridObject(HybridIncomingCallSpec::TAG),
|
|
39
|
+
JHybridObject(javaPart),
|
|
40
|
+
_javaPart(jni::make_global(javaPart)) {}
|
|
41
|
+
~JHybridIncomingCallSpec() override {
|
|
42
|
+
// Hermes GC can destroy JS objects on a non-JNI Thread.
|
|
43
|
+
jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public:
|
|
47
|
+
inline const jni::global_ref<JHybridIncomingCallSpec::JavaPart>& getJavaPart() const noexcept {
|
|
48
|
+
return _javaPart;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public:
|
|
52
|
+
// Properties
|
|
53
|
+
std::string getColor() override;
|
|
54
|
+
void setColor(const std::string& color) override;
|
|
55
|
+
std::optional<std::string> getCallerName() override;
|
|
56
|
+
void setCallerName(const std::optional<std::string>& callerName) override;
|
|
57
|
+
std::optional<std::string> getAvatar() override;
|
|
58
|
+
void setAvatar(const std::optional<std::string>& avatar) override;
|
|
59
|
+
std::optional<std::string> getCallType() override;
|
|
60
|
+
void setCallType(const std::optional<std::string>& callType) override;
|
|
61
|
+
std::optional<double> getTimeout() override;
|
|
62
|
+
void setTimeout(std::optional<double> timeout) override;
|
|
63
|
+
|
|
64
|
+
public:
|
|
65
|
+
// Methods
|
|
66
|
+
void answerCall() override;
|
|
67
|
+
void rejectCall() override;
|
|
68
|
+
|
|
69
|
+
private:
|
|
70
|
+
jni::global_ref<JHybridIncomingCallSpec::JavaPart> _javaPart;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
} // namespace margelo::nitro::incomingcall
|