@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.
Files changed (55) hide show
  1. package/IncomingCall.podspec +29 -0
  2. package/LICENSE +20 -0
  3. package/README.md +280 -0
  4. package/android/CMakeLists.txt +24 -0
  5. package/android/build.gradle +118 -0
  6. package/android/src/main/AndroidManifest.xml +35 -0
  7. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  8. package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCall.kt +219 -0
  9. package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCallActivity.kt +314 -0
  10. package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCallModule.kt +152 -0
  11. package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCallPackage.kt +31 -0
  12. package/android/src/main/java/com/margelo/nitro/incomingcall/IncomingCallService.kt +109 -0
  13. package/ios/IncomingCall.swift +28 -0
  14. package/lib/module/IncomingCall.nitro.js +4 -0
  15. package/lib/module/IncomingCall.nitro.js.map +1 -0
  16. package/lib/module/index.js +137 -0
  17. package/lib/module/index.js.map +1 -0
  18. package/lib/module/package.json +1 -0
  19. package/lib/typescript/package.json +1 -0
  20. package/lib/typescript/src/IncomingCall.nitro.d.ts +21 -0
  21. package/lib/typescript/src/IncomingCall.nitro.d.ts.map +1 -0
  22. package/lib/typescript/src/index.d.ts +43 -0
  23. package/lib/typescript/src/index.d.ts.map +1 -0
  24. package/nitro.json +17 -0
  25. package/nitrogen/generated/android/c++/JHybridIncomingCallSpec.cpp +101 -0
  26. package/nitrogen/generated/android/c++/JHybridIncomingCallSpec.hpp +73 -0
  27. package/nitrogen/generated/android/c++/views/JHybridIncomingCallStateUpdater.cpp +72 -0
  28. package/nitrogen/generated/android/c++/views/JHybridIncomingCallStateUpdater.hpp +49 -0
  29. package/nitrogen/generated/android/incomingcall+autolinking.cmake +83 -0
  30. package/nitrogen/generated/android/incomingcall+autolinking.gradle +27 -0
  31. package/nitrogen/generated/android/incomingcallOnLoad.cpp +56 -0
  32. package/nitrogen/generated/android/incomingcallOnLoad.hpp +34 -0
  33. package/nitrogen/generated/android/kotlin/com/margelo/nitro/incomingcall/HybridIncomingCallSpec.kt +87 -0
  34. package/nitrogen/generated/android/kotlin/com/margelo/nitro/incomingcall/incomingcallOnLoad.kt +35 -0
  35. package/nitrogen/generated/android/kotlin/com/margelo/nitro/incomingcall/views/HybridIncomingCallManager.kt +70 -0
  36. package/nitrogen/generated/android/kotlin/com/margelo/nitro/incomingcall/views/HybridIncomingCallStateUpdater.kt +23 -0
  37. package/nitrogen/generated/ios/IncomingCall+autolinking.rb +60 -0
  38. package/nitrogen/generated/ios/IncomingCall-Swift-Cxx-Bridge.cpp +33 -0
  39. package/nitrogen/generated/ios/IncomingCall-Swift-Cxx-Bridge.hpp +83 -0
  40. package/nitrogen/generated/ios/IncomingCall-Swift-Cxx-Umbrella.hpp +45 -0
  41. package/nitrogen/generated/ios/IncomingCallAutolinking.mm +33 -0
  42. package/nitrogen/generated/ios/IncomingCallAutolinking.swift +26 -0
  43. package/nitrogen/generated/ios/c++/HybridIncomingCallSpecSwift.cpp +11 -0
  44. package/nitrogen/generated/ios/c++/HybridIncomingCallSpecSwift.hpp +121 -0
  45. package/nitrogen/generated/ios/c++/views/HybridIncomingCallComponent.mm +127 -0
  46. package/nitrogen/generated/ios/swift/HybridIncomingCallSpec.swift +60 -0
  47. package/nitrogen/generated/ios/swift/HybridIncomingCallSpec_cxx.swift +270 -0
  48. package/nitrogen/generated/shared/c++/HybridIncomingCallSpec.cpp +32 -0
  49. package/nitrogen/generated/shared/c++/HybridIncomingCallSpec.hpp +73 -0
  50. package/nitrogen/generated/shared/c++/views/HybridIncomingCallComponent.cpp +127 -0
  51. package/nitrogen/generated/shared/c++/views/HybridIncomingCallComponent.hpp +115 -0
  52. package/nitrogen/generated/shared/json/IncomingCallConfig.json +14 -0
  53. package/package.json +180 -0
  54. package/src/IncomingCall.nitro.ts +27 -0
  55. 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,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=IncomingCall.nitro.js.map
@@ -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