omikit-plugin 0.3.0 → 1.0.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/android/build.gradle +9 -14
- package/android/src/main/java/com/omikitplugin/OmikitPluginModule.kt +143 -96
- package/android/src/main/java/com/omikitplugin/constants/constant.kt +7 -18
- package/ios/CallProcess/CallManager.swift +81 -138
- package/ios/Constant/Constant.swift +7 -18
- package/ios/OmikitPlugin.m +10 -4
- package/ios/OmikitPlugin.swift +51 -18
- package/lib/commonjs/index.js +19 -2
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +15 -2
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/index.d.ts +10 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +18 -2
- package/ios/CallProcess/NSUserActivity.swift +0 -58
- package/ios/CallProcess/StringUtils.swift +0 -18
package/android/build.gradle
CHANGED
|
@@ -70,19 +70,6 @@ android {
|
|
|
70
70
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
repositories {
|
|
74
|
-
mavenCentral()
|
|
75
|
-
google()
|
|
76
|
-
jcenter() // Warning: this repository is going to shut down soon
|
|
77
|
-
maven {
|
|
78
|
-
url("https://vihatgroup.jfrog.io/artifactory/omi-voice/")
|
|
79
|
-
credentials {
|
|
80
|
-
username = "downloader"
|
|
81
|
-
password = "Omi@2022"
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
73
|
allprojects {
|
|
87
74
|
repositories {
|
|
88
75
|
google()
|
|
@@ -109,7 +96,7 @@ dependencies {
|
|
|
109
96
|
implementation "com.facebook.react:react-native:+" // From node_modules
|
|
110
97
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
111
98
|
|
|
112
|
-
api 'vn.vihat.omicall:omi-sdk:0.
|
|
99
|
+
api 'vn.vihat.omicall:omi-sdk:1.0.10'
|
|
113
100
|
|
|
114
101
|
implementation 'androidx.core:core-ktx:1.7.0'
|
|
115
102
|
implementation 'androidx.fragment:fragment-ktx:1.4.0'
|
|
@@ -124,6 +111,14 @@ dependencies {
|
|
|
124
111
|
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
|
|
125
112
|
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
|
|
126
113
|
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0"
|
|
114
|
+
implementation 'androidx.databinding:viewbinding:7.1.2'
|
|
115
|
+
implementation("com.squareup.retrofit2:retrofit:2.9.0") {
|
|
116
|
+
exclude module: 'okhttp'
|
|
117
|
+
}
|
|
118
|
+
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
|
|
119
|
+
implementation "com.squareup.okhttp3:okhttp:4.9.1"
|
|
120
|
+
implementation "com.squareup.okhttp3:okhttp-urlconnection:4.9.1"
|
|
121
|
+
implementation "com.squareup.okhttp3:logging-interceptor:4.9.1"
|
|
127
122
|
}
|
|
128
123
|
|
|
129
124
|
if (isNewArchitectureEnabled()) {
|
|
@@ -1,46 +1,160 @@
|
|
|
1
1
|
package com.omikitplugin
|
|
2
2
|
|
|
3
3
|
import android.Manifest
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.hardware.camera2.CameraManager
|
|
6
|
+
import android.os.Build
|
|
7
|
+
import android.util.Log
|
|
4
8
|
import androidx.core.app.ActivityCompat
|
|
5
9
|
import com.facebook.react.ReactActivity
|
|
6
10
|
import com.facebook.react.bridge.*
|
|
7
11
|
import com.facebook.react.modules.core.RCTNativeAppEventEmitter
|
|
12
|
+
import com.omikitplugin.constants.*
|
|
8
13
|
import vn.vihat.omicall.omisdk.OmiClient
|
|
9
14
|
import vn.vihat.omicall.omisdk.OmiListener
|
|
10
|
-
import vn.vihat.omicall.omisdk.OmiSDKUtils
|
|
15
|
+
import vn.vihat.omicall.omisdk.utils.OmiSDKUtils
|
|
11
16
|
|
|
12
17
|
|
|
13
18
|
class OmikitPluginModule(reactContext: ReactApplicationContext?) :
|
|
14
|
-
ReactContextBaseJavaModule(reactContext)
|
|
19
|
+
ReactContextBaseJavaModule(reactContext) {
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
private var icSpeaker = false
|
|
23
|
+
private var isMute = false
|
|
24
|
+
|
|
25
|
+
private val callListener = object : OmiListener {
|
|
26
|
+
|
|
27
|
+
override fun incomingReceived(callerId: Int, phoneNumber: String?, isVideo: Boolean?) {
|
|
28
|
+
val map: WritableMap = WritableNativeMap()
|
|
29
|
+
map.putBoolean("isVideo", isVideo ?: true)
|
|
30
|
+
map.putString("callerNumber", phoneNumber)
|
|
31
|
+
sendEvent(INCOMING_RECEIVED, map)
|
|
32
|
+
Log.d("omikit", "incomingReceived: ")
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
override fun onCallEnd() {
|
|
36
|
+
sendEvent(CALL_END, null)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override fun onCallEstablished(
|
|
40
|
+
callerId: Int,
|
|
41
|
+
phoneNumber: String?,
|
|
42
|
+
isVideo: Boolean?,
|
|
43
|
+
startTime: Long,
|
|
44
|
+
) {
|
|
45
|
+
val map: WritableMap = WritableNativeMap()
|
|
46
|
+
val sipNumber = OmiClient.instance.callUUID
|
|
47
|
+
map.putString("callerNumber", sipNumber)
|
|
48
|
+
map.putBoolean("isVideo", isVideo ?: true)
|
|
49
|
+
sendEvent(CALL_ESTABLISHED, map)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
override fun onConnectionTimeout() {
|
|
53
|
+
// sendEvent("onConnectionTimeout", null)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
override fun onHold(isHold: Boolean) {
|
|
57
|
+
val map: WritableMap = WritableNativeMap()
|
|
58
|
+
map.putBoolean("isHold", isHold)
|
|
59
|
+
sendEvent(HOLD, map)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
override fun onMuted(isMuted: Boolean) {
|
|
63
|
+
// val map: WritableMap = WritableNativeMap()
|
|
64
|
+
// map.putBoolean("isMuted", isMuted)
|
|
65
|
+
// sendEvent(MUTED, map)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
override fun onOutgoingStarted(callerId: Int, phoneNumber: String?, isVideo: Boolean?) {
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
override fun onRinging() {
|
|
73
|
+
// sendEvent("onRinging", null)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
override fun onVideoSize(width: Int, height: Int) {
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
}
|
|
15
80
|
|
|
16
81
|
override fun getName(): String {
|
|
17
82
|
return NAME
|
|
18
83
|
}
|
|
19
84
|
|
|
85
|
+
override fun initialize() {
|
|
86
|
+
super.initialize()
|
|
87
|
+
OmiClient(reactApplicationContext!!)
|
|
88
|
+
OmiClient.instance.setListener(callListener)
|
|
89
|
+
}
|
|
90
|
+
|
|
20
91
|
@ReactMethod
|
|
21
92
|
fun initCall(data: ReadableMap, promise: Promise) {
|
|
22
93
|
currentActivity?.runOnUiThread {
|
|
23
|
-
val userName = data.getString("userName")
|
|
24
|
-
val password = data.getString("password")
|
|
25
|
-
val realm = data.getString("realm")
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
94
|
+
val userName = data.getString("userName")
|
|
95
|
+
val password = data.getString("password")
|
|
96
|
+
val realm = data.getString("realm")
|
|
97
|
+
val host = data.getString("host")
|
|
98
|
+
val isVideo = data.getBoolean("isVideo")
|
|
99
|
+
if (userName != null && password != null && realm != null && host != null) {
|
|
100
|
+
OmiClient.register(
|
|
101
|
+
reactApplicationContext!!,
|
|
102
|
+
userName,
|
|
103
|
+
password,
|
|
104
|
+
isVideo,
|
|
105
|
+
realm,
|
|
106
|
+
host = host,
|
|
107
|
+
customUI = true,
|
|
108
|
+
isTcp = true
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
112
|
+
ActivityCompat.requestPermissions(
|
|
113
|
+
currentActivity!!,
|
|
114
|
+
arrayOf(
|
|
115
|
+
Manifest.permission.USE_SIP,
|
|
116
|
+
Manifest.permission.CALL_PHONE,
|
|
117
|
+
Manifest.permission.CAMERA,
|
|
118
|
+
Manifest.permission.MODIFY_AUDIO_SETTINGS,
|
|
119
|
+
Manifest.permission.RECORD_AUDIO,
|
|
120
|
+
Manifest.permission.POST_NOTIFICATIONS,
|
|
121
|
+
),
|
|
122
|
+
0,
|
|
123
|
+
)
|
|
124
|
+
} else {
|
|
125
|
+
ActivityCompat.requestPermissions(
|
|
126
|
+
currentActivity!!,
|
|
127
|
+
arrayOf(
|
|
128
|
+
Manifest.permission.USE_SIP,
|
|
129
|
+
Manifest.permission.CALL_PHONE,
|
|
130
|
+
Manifest.permission.CAMERA,
|
|
131
|
+
Manifest.permission.MODIFY_AUDIO_SETTINGS,
|
|
132
|
+
Manifest.permission.RECORD_AUDIO,
|
|
133
|
+
),
|
|
134
|
+
0,
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
if (isVideo) {
|
|
138
|
+
val cm = currentActivity!!.getSystemService(Context.CAMERA_SERVICE) as CameraManager
|
|
139
|
+
OmiClient.instance.setCameraManager(cm)
|
|
140
|
+
}
|
|
40
141
|
promise.resolve(true)
|
|
41
142
|
}
|
|
42
143
|
}
|
|
43
144
|
|
|
145
|
+
@ReactMethod
|
|
146
|
+
fun getInitialCall(promise: Promise) {
|
|
147
|
+
currentActivity?.runOnUiThread {
|
|
148
|
+
promise.resolve(false)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@ReactMethod
|
|
153
|
+
fun joinCall(promise: Promise) {
|
|
154
|
+
OmiClient.instance.pickUp(true)
|
|
155
|
+
promise.resolve(true)
|
|
156
|
+
}
|
|
157
|
+
|
|
44
158
|
@ReactMethod
|
|
45
159
|
fun updateToken(data: ReadableMap, promise: Promise) {
|
|
46
160
|
currentActivity?.runOnUiThread {
|
|
@@ -51,21 +165,18 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
|
|
|
51
165
|
"",
|
|
52
166
|
deviceTokenAndroid,
|
|
53
167
|
deviceId,
|
|
54
|
-
appId
|
|
168
|
+
appId,
|
|
55
169
|
)
|
|
56
170
|
promise.resolve(true)
|
|
57
171
|
}
|
|
58
172
|
}
|
|
59
173
|
|
|
60
|
-
|
|
61
174
|
@ReactMethod
|
|
62
175
|
fun startCall(data: ReadableMap, promise: Promise) {
|
|
63
176
|
val phoneNumber = data.getString("phoneNumber") as String
|
|
64
177
|
val isVideo = data.getBoolean("isVideo")
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
promise.resolve(true)
|
|
68
|
-
}
|
|
178
|
+
OmiClient.instance.startCall(phoneNumber, isVideo)
|
|
179
|
+
promise.resolve(true)
|
|
69
180
|
}
|
|
70
181
|
|
|
71
182
|
@ReactMethod
|
|
@@ -78,48 +189,16 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
|
|
|
78
189
|
fun toggleMute(promise: Promise) {
|
|
79
190
|
OmiClient.instance.toggleMute()
|
|
80
191
|
promise.resolve(true)
|
|
192
|
+
isMute = !isMute
|
|
193
|
+
sendEvent(MUTED, isMute)
|
|
81
194
|
}
|
|
82
195
|
|
|
83
196
|
@ReactMethod
|
|
84
|
-
fun toggleSpeak(
|
|
85
|
-
|
|
86
|
-
OmiClient.instance.toggleSpeaker(
|
|
87
|
-
promise.resolve(true)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
@ReactMethod
|
|
91
|
-
fun decline(promise: Promise) {
|
|
92
|
-
OmiClient.instance.decline()
|
|
93
|
-
promise.resolve(true)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
@ReactMethod
|
|
97
|
-
fun hangup(data: ReadableMap, promise: Promise) {
|
|
98
|
-
val callId = data.getInt("callId")
|
|
99
|
-
OmiClient.instance.hangUp(callId)
|
|
100
|
-
promise.resolve(true)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
@ReactMethod
|
|
105
|
-
fun onCallStart(data: ReadableMap, promise: Promise) {
|
|
106
|
-
val callId = data.getInt("callId")
|
|
107
|
-
OmiClient.instance.onCallStarted(callId)
|
|
108
|
-
promise.resolve(true)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
@ReactMethod
|
|
112
|
-
fun onHold(data: ReadableMap, promise: Promise) {
|
|
113
|
-
val isHold = data.getBoolean("isHold")
|
|
114
|
-
OmiClient.instance.onHold(isHold)
|
|
115
|
-
promise.resolve(true)
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
@ReactMethod
|
|
119
|
-
fun onMute(data: ReadableMap, promise: Promise) {
|
|
120
|
-
val isMute = data.getBoolean("isMute")
|
|
121
|
-
OmiClient.instance.onMuted(isMute)
|
|
197
|
+
fun toggleSpeak(promise: Promise) {
|
|
198
|
+
icSpeaker = !icSpeaker
|
|
199
|
+
OmiClient.instance.toggleSpeaker(icSpeaker)
|
|
122
200
|
promise.resolve(true)
|
|
201
|
+
sendEvent(SPEAKER, icSpeaker)
|
|
123
202
|
}
|
|
124
203
|
|
|
125
204
|
@ReactMethod
|
|
@@ -141,7 +220,7 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
|
|
|
141
220
|
companion object {
|
|
142
221
|
const val NAME = "OmikitPlugin"
|
|
143
222
|
fun onDestroy() {
|
|
144
|
-
|
|
223
|
+
|
|
145
224
|
}
|
|
146
225
|
|
|
147
226
|
fun onRequestPermissionsResult(
|
|
@@ -156,38 +235,6 @@ class OmikitPluginModule(reactContext: ReactApplicationContext?) :
|
|
|
156
235
|
}
|
|
157
236
|
}
|
|
158
237
|
|
|
159
|
-
override fun incomingReceived(callerId: Int, phoneNumber: String?) {
|
|
160
|
-
val map: WritableMap = WritableNativeMap()
|
|
161
|
-
map.putInt("callerId", callerId)
|
|
162
|
-
sendEvent("phoneNumber", phoneNumber)
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
override fun onCallEnd() {
|
|
166
|
-
sendEvent("onCallEnd", false)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
override fun onCallEstablished() {
|
|
170
|
-
sendEvent("onCallEstablished", null)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
override fun onConnectionTimeout() {
|
|
174
|
-
sendEvent("onConnectionTimeout", null)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
override fun onHold(isHold: Boolean) {
|
|
178
|
-
sendEvent("onHold", null)
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
override fun onMuted(isMuted: Boolean) {
|
|
182
|
-
val map: WritableMap = WritableNativeMap()
|
|
183
|
-
map.putBoolean("isMuted", isMuted)
|
|
184
|
-
sendEvent("onMuted", map)
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
override fun onRinging() {
|
|
188
|
-
sendEvent("onRinging", null)
|
|
189
|
-
}
|
|
190
|
-
|
|
191
238
|
private fun sendEvent(eventName: String?, params: Any?) {
|
|
192
239
|
currentActivity?.runOnUiThread {
|
|
193
240
|
reactApplicationContext.getJSModule(RCTNativeAppEventEmitter::class.java)
|
|
@@ -3,29 +3,18 @@ package com.omikitplugin.constants
|
|
|
3
3
|
//EVENT
|
|
4
4
|
const val INIT_CALL = "INIT_CALL";
|
|
5
5
|
const val UPDATE_TOKEN = "UPDATE_TOKEN";
|
|
6
|
-
const val START_OMI_SERVICE = "START_OMI_SERVICE";
|
|
7
6
|
const val START_CALL = "START_CALL";
|
|
8
7
|
const val END_CALL = "END_CALL";
|
|
9
8
|
const val TOGGLE_MUTE = "TOGGLE_MUTE";
|
|
10
9
|
const val TOGGLE_SPEAK = "TOGGLE_SPEAK";
|
|
11
|
-
const val CHECK_ON_GOING_CALL = "CHECK_ON_GOING_CALL";
|
|
12
|
-
const val DECLINE = "DECLINE";
|
|
13
|
-
const val FORWARD_CALL_TO = "FORWARD_CALL_TO";
|
|
14
|
-
const val HANGUP = "HANGUP";
|
|
15
|
-
const val ON_CALL_STARTED = "ON_CALL_STARTED";
|
|
16
|
-
const val ON_HOLD = "ON_HOLD";
|
|
17
|
-
const val ON_IN_COMING_RECEIVE = "ON_IN_COMING_RECEIVE";
|
|
18
|
-
const val ON_MUTE = "ON_MUTE";
|
|
19
|
-
const val ON_OUT_GOING = "ON_OUT_GOING";
|
|
20
10
|
const val REGISTER = "REGISTER";
|
|
21
11
|
const val SEND_DTMF = "SEND_DTMF";
|
|
22
12
|
|
|
23
13
|
//LISTENER
|
|
24
|
-
const val
|
|
25
|
-
const val
|
|
26
|
-
const val
|
|
27
|
-
const val
|
|
28
|
-
const val
|
|
29
|
-
const val
|
|
30
|
-
const val
|
|
31
|
-
|
|
14
|
+
const val CALL_ESTABLISHED = "CALL_ESTABLISHED"
|
|
15
|
+
const val CALL_END = "CALL_END"
|
|
16
|
+
const val INCOMING_RECEIVED = "INCOMING_RECEIVED"
|
|
17
|
+
//const val CONNECTION_TIMEOUT = "CONNECTION_TIMEOUT"
|
|
18
|
+
const val HOLD = "HOLD"
|
|
19
|
+
const val MUTED = "MUTED"
|
|
20
|
+
const val SPEAKER = "SPEAKER"
|
|
@@ -15,15 +15,10 @@ import AVFoundation
|
|
|
15
15
|
class CallManager {
|
|
16
16
|
|
|
17
17
|
static private var instance: CallManager? = nil // Instance
|
|
18
|
-
var call: OMICall? // Call
|
|
19
|
-
private var numberRetry: Int = 0
|
|
20
|
-
var isCallError: Bool = false // check when call error
|
|
21
18
|
private let omiLib = OMISIPLib.sharedInstance()
|
|
22
|
-
|
|
23
|
-
var currentConfirmedCall : OMICall?
|
|
19
|
+
var isSpeaker = false
|
|
24
20
|
var videoManager: OMIVideoViewManager?
|
|
25
21
|
|
|
26
|
-
|
|
27
22
|
/// Get instance
|
|
28
23
|
static func shareInstance() -> CallManager {
|
|
29
24
|
if (instance == nil) {
|
|
@@ -32,6 +27,14 @@ class CallManager {
|
|
|
32
27
|
return instance!
|
|
33
28
|
}
|
|
34
29
|
|
|
30
|
+
func getAvailableCall() -> OMICall? {
|
|
31
|
+
var currentCall = omiLib.getCurrentConfirmCall()
|
|
32
|
+
if (currentCall == nil) {
|
|
33
|
+
currentCall = omiLib.getNewestCall()
|
|
34
|
+
}
|
|
35
|
+
return currentCall
|
|
36
|
+
}
|
|
37
|
+
|
|
35
38
|
func updateToken(params: [String: Any]) {
|
|
36
39
|
if let apnsToken = params["apnsToken"] as? String {
|
|
37
40
|
OmiClient.setUserPushNotificationToken(apnsToken)
|
|
@@ -39,19 +42,14 @@ class CallManager {
|
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
func initEndpoint(params: [String: Any]){
|
|
42
|
-
var isSupportVideoCall = false
|
|
43
45
|
if let userName = params["userName"] as? String, let password = params["password"] as? String, let realm = params["realm"] as? String {
|
|
44
46
|
OmiClient.initWithUsername(userName, password: password, realm: realm)
|
|
45
|
-
if let isVideoCall = params["isVideo"] as? Bool {
|
|
46
|
-
isSupportVideoCall = isVideoCall
|
|
47
|
-
}
|
|
48
|
-
OmiClient.startOmiService(isSupportVideoCall)
|
|
49
|
-
if (isSupportVideoCall) {
|
|
50
|
-
OmiClient.registerAccount()
|
|
51
|
-
videoManager = OMIVideoViewManager.init()
|
|
52
|
-
}
|
|
53
|
-
registerNotificationCenter()
|
|
54
47
|
}
|
|
48
|
+
if let isVideoCall = params["isVideo"] as? Bool, isVideoCall == true {
|
|
49
|
+
OmiClient.startOmiService(true)
|
|
50
|
+
videoManager = OMIVideoViewManager.init()
|
|
51
|
+
}
|
|
52
|
+
registerNotificationCenter()
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
func registerNotificationCenter() {
|
|
@@ -70,7 +68,7 @@ class CallManager {
|
|
|
70
68
|
)
|
|
71
69
|
}
|
|
72
70
|
}
|
|
73
|
-
|
|
71
|
+
|
|
74
72
|
@objc func callDealloc(_ notification: NSNotification) {
|
|
75
73
|
guard let userInfo = notification.userInfo,
|
|
76
74
|
let call = userInfo[OMINotificationUserInfoCallKey] as? OMICall else {
|
|
@@ -79,7 +77,6 @@ class CallManager {
|
|
|
79
77
|
if (call.callState == .disconnected) {
|
|
80
78
|
DispatchQueue.main.async {
|
|
81
79
|
OmikitPlugin.instance.sendEvent(withName: onCallEnd, body: [:])
|
|
82
|
-
self.currentConfirmedCall = nil
|
|
83
80
|
}
|
|
84
81
|
}
|
|
85
82
|
}
|
|
@@ -95,7 +92,6 @@ class CallManager {
|
|
|
95
92
|
case .calling:
|
|
96
93
|
if (!call.isIncoming) {
|
|
97
94
|
NSLog("Outgoing call, in CALLING state, with UUID \(call.uuid)")
|
|
98
|
-
OmikitPlugin.instance.sendEvent(withName: onRinging, body: [:])
|
|
99
95
|
}
|
|
100
96
|
break
|
|
101
97
|
case .early:
|
|
@@ -109,19 +105,10 @@ class CallManager {
|
|
|
109
105
|
}
|
|
110
106
|
break
|
|
111
107
|
case .confirmed:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
OmikitPlugin.instance.sendEvent(withName: onMuted, body: ["isMuted": call.muted])
|
|
117
|
-
self.currentConfirmedCall = call
|
|
118
|
-
return
|
|
119
|
-
}
|
|
120
|
-
NSLog("Outgoing call, in CONFIRMED state, with UUID: \(call.uuid)")
|
|
121
|
-
OmikitPlugin.instance.sendEvent(withName: onCallEstablished, body: [:])
|
|
122
|
-
OmikitPlugin.instance.sendEvent(withName: onMuted, body: ["isMuted": call.muted])
|
|
123
|
-
self.currentConfirmedCall = call
|
|
124
|
-
}
|
|
108
|
+
NSLog("Outgoing call, in CONFIRMED state, with UUID: \(call.uuid)")
|
|
109
|
+
OmikitPlugin.instance.sendEvent(withName: onCallEstablished, body: ["isVideo": call.isVideo, "callerNumber": call.callerNumber])
|
|
110
|
+
print(call.muted)
|
|
111
|
+
OmikitPlugin.instance.sendOnMuteStatus()
|
|
125
112
|
break
|
|
126
113
|
case .disconnected:
|
|
127
114
|
if (!call.connected) {
|
|
@@ -129,36 +116,26 @@ class CallManager {
|
|
|
129
116
|
} else if (!call.userDidHangUp) {
|
|
130
117
|
NSLog("Call remotly ended, in DISCONNECTED state, with UUID: \(call.uuid)")
|
|
131
118
|
}
|
|
132
|
-
print(omiLib.getCurrentCall()?.uuid.uuidString)
|
|
133
119
|
print(call.uuid.uuidString)
|
|
134
|
-
|
|
135
|
-
OmikitPlugin.instance.sendEvent(withName: onCallEnd, body: [:])
|
|
136
|
-
currentConfirmedCall = nil
|
|
137
|
-
break
|
|
138
|
-
}
|
|
139
|
-
if currentConfirmedCall == nil {
|
|
140
|
-
OmikitPlugin.instance.sendEvent(withName: onCallEnd, body: [:])
|
|
141
|
-
break
|
|
142
|
-
}
|
|
143
|
-
print(omiLib.getNewestCall()?.uuid.uuidString)
|
|
120
|
+
OmikitPlugin.instance.sendEvent(withName: onCallEnd, body: [:])
|
|
144
121
|
break
|
|
145
122
|
case .incoming:
|
|
146
|
-
OmikitPlugin.instance.sendEvent(withName: incomingReceived, body: ["
|
|
123
|
+
OmikitPlugin.instance.sendEvent(withName: incomingReceived, body: ["isVideo": call.isVideo, "callerNumber": call.callerNumber ?? ""])
|
|
147
124
|
break
|
|
148
125
|
case .muted:
|
|
149
|
-
|
|
126
|
+
print("muteddddddd")
|
|
150
127
|
break
|
|
151
128
|
case .hold:
|
|
152
|
-
|
|
129
|
+
print("holdddddddd")
|
|
153
130
|
break
|
|
154
|
-
|
|
131
|
+
default:
|
|
155
132
|
NSLog("Default call state")
|
|
133
|
+
break
|
|
156
134
|
}
|
|
157
135
|
}
|
|
158
136
|
|
|
159
137
|
/// Start call
|
|
160
138
|
func startCall(_ phoneNumber: String, isVideo: Bool) {
|
|
161
|
-
registerNotificationCenter()
|
|
162
139
|
if (isVideo) {
|
|
163
140
|
OmiClient.startVideoCall(phoneNumber)
|
|
164
141
|
return
|
|
@@ -166,82 +143,49 @@ class CallManager {
|
|
|
166
143
|
OmiClient.startCall(phoneNumber)
|
|
167
144
|
}
|
|
168
145
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
146
|
+
func endAvailableCall() {
|
|
147
|
+
guard let call = getAvailableCall() else {
|
|
148
|
+
OmikitPlugin.instance.sendEvent(withName: onCallEnd, body: [:])
|
|
172
149
|
return
|
|
173
150
|
}
|
|
174
|
-
omiLib.callManager.end(call)
|
|
175
|
-
if error != nil {
|
|
176
|
-
NSLog("error hanging up call(\(call.uuid.uuidString)): \(error!)")
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
OmikitPlugin.instance.sendEvent(withName: onCallEnd, body: [:])
|
|
180
|
-
NotificationCenter.default.removeObserver(self)
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
func endCurrentConfirmCall() {
|
|
184
|
-
guard let call = omiLib.getCurrentCall() else {
|
|
185
|
-
endNewestCall()
|
|
186
|
-
return
|
|
187
|
-
}
|
|
188
|
-
omiLib.callManager.end(call) { error in
|
|
189
|
-
if error != nil {
|
|
190
|
-
NSLog("error hanging up call(\(call.uuid.uuidString)): \(error!)")
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
OmikitPlugin.instance.sendEvent(withName: onCallEnd, body: [:])
|
|
194
|
-
NotificationCenter.default.removeObserver(self)
|
|
151
|
+
omiLib.callManager.end(call)
|
|
195
152
|
}
|
|
196
153
|
|
|
197
154
|
|
|
198
155
|
func endAllCalls() {
|
|
199
156
|
omiLib.callManager.endAllCalls()
|
|
200
|
-
|
|
201
|
-
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
func joinCall() {
|
|
160
|
+
guard let call = getAvailableCall() else {
|
|
161
|
+
return
|
|
162
|
+
}
|
|
163
|
+
OmiClient.answerIncommingCall(call.uuid)
|
|
202
164
|
}
|
|
203
165
|
|
|
204
166
|
func sendDTMF(character: String) {
|
|
205
|
-
guard let call =
|
|
167
|
+
guard let call = getAvailableCall() else {
|
|
206
168
|
return
|
|
207
169
|
}
|
|
208
170
|
try? call.sendDTMF(character)
|
|
209
171
|
}
|
|
210
172
|
|
|
211
|
-
|
|
212
173
|
/// Toogle mtue
|
|
213
|
-
func toggleMute(
|
|
214
|
-
guard let
|
|
215
|
-
return
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
omiLib.callManager.toggleMute(for: omicall) { error in
|
|
219
|
-
if error != nil {
|
|
220
|
-
NSLog("toggle mute error: \(error))")
|
|
221
|
-
}
|
|
174
|
+
func toggleMute() {
|
|
175
|
+
guard let call = getAvailableCall() else {
|
|
176
|
+
return
|
|
222
177
|
}
|
|
223
|
-
|
|
178
|
+
try? call.toggleMute()
|
|
224
179
|
}
|
|
225
180
|
|
|
226
181
|
/// Toogle hold
|
|
227
|
-
func toggleHold(
|
|
228
|
-
guard let
|
|
182
|
+
func toggleHold() {
|
|
183
|
+
guard let call = getAvailableCall() else {
|
|
229
184
|
return
|
|
230
185
|
}
|
|
231
|
-
|
|
232
|
-
guard let self = self else { return }
|
|
233
|
-
self.omiLib.callManager.toggleHold(for: omicall) { error in
|
|
234
|
-
if error != nil {
|
|
235
|
-
NSLog("Error holding current call: \(error!)")
|
|
236
|
-
return
|
|
237
|
-
} else {
|
|
238
|
-
completion()
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
186
|
+
try? call.toggleHold()
|
|
242
187
|
}
|
|
243
188
|
|
|
244
|
-
|
|
245
189
|
/// Toogle speaker
|
|
246
190
|
func toogleSpeaker() {
|
|
247
191
|
do {
|
|
@@ -255,22 +199,21 @@ class CallManager {
|
|
|
255
199
|
}
|
|
256
200
|
} catch (let error){
|
|
257
201
|
NSLog("Error toogleSpeaker current call: \(error)")
|
|
258
|
-
|
|
202
|
+
|
|
259
203
|
}
|
|
260
204
|
}
|
|
261
205
|
|
|
262
|
-
|
|
263
206
|
func inputs() -> [[String: String]] {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
207
|
+
let inputs = AVAudioSession.sharedInstance().availableInputs ?? []
|
|
208
|
+
let results = inputs.map { item in
|
|
209
|
+
return [
|
|
210
|
+
"name": item.portName,
|
|
211
|
+
"id": item.uid,
|
|
212
|
+
]
|
|
213
|
+
}
|
|
214
|
+
return results
|
|
272
215
|
}
|
|
273
|
-
|
|
216
|
+
|
|
274
217
|
func setInput(id: String) {
|
|
275
218
|
let inputs = AVAudioSession.sharedInstance().availableInputs ?? []
|
|
276
219
|
if let newOutput = inputs.first(where: {$0.uid == id}) {
|
|
@@ -281,10 +224,10 @@ class CallManager {
|
|
|
281
224
|
func outputs() -> [[String: String]] {
|
|
282
225
|
let outputs = AVAudioSession.sharedInstance().currentRoute.outputs
|
|
283
226
|
var results = outputs.map { item in
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
227
|
+
return [
|
|
228
|
+
"name": item.portName,
|
|
229
|
+
"id": item.uid,
|
|
230
|
+
]
|
|
288
231
|
}
|
|
289
232
|
let hasSpeaker = results.contains{ $0["name"] == "Speaker" }
|
|
290
233
|
if (!hasSpeaker) {
|
|
@@ -334,29 +277,29 @@ class CallManager {
|
|
|
334
277
|
}
|
|
335
278
|
}
|
|
336
279
|
|
|
337
|
-
// func getLocalPreviewView(callback: @escaping (UIView) -> Void) {
|
|
338
|
-
// guard let videoManager = videoManager else { return }
|
|
339
|
-
// videoManager.localView {previewView in
|
|
340
|
-
// DispatchQueue.main.async {
|
|
341
|
-
// if (previewView != nil) {
|
|
342
|
-
// previewView!.contentMode = .scaleAspectFill
|
|
343
|
-
// callback(previewView!)
|
|
344
|
-
// }
|
|
345
|
-
// }
|
|
346
|
-
// }
|
|
347
|
-
// }
|
|
348
|
-
//
|
|
349
|
-
// func getRemotePreviewView(callback: @escaping (UIView) -> Void) {
|
|
350
|
-
// guard let videoManager = videoManager else { return }
|
|
351
|
-
// videoManager.remoteView { previewView in
|
|
352
|
-
// DispatchQueue.main.async {
|
|
353
|
-
// if (previewView != nil) {
|
|
354
|
-
// previewView!.contentMode = .scaleAspectFill
|
|
355
|
-
// callback(previewView!)
|
|
356
|
-
// }
|
|
357
|
-
// }
|
|
358
|
-
// }
|
|
359
|
-
// }
|
|
280
|
+
// func getLocalPreviewView(callback: @escaping (UIView) -> Void) {
|
|
281
|
+
// guard let videoManager = videoManager else { return }
|
|
282
|
+
// videoManager.localView {previewView in
|
|
283
|
+
// DispatchQueue.main.async {
|
|
284
|
+
// if (previewView != nil) {
|
|
285
|
+
// previewView!.contentMode = .scaleAspectFill
|
|
286
|
+
// callback(previewView!)
|
|
287
|
+
// }
|
|
288
|
+
// }
|
|
289
|
+
// }
|
|
290
|
+
// }
|
|
291
|
+
//
|
|
292
|
+
// func getRemotePreviewView(callback: @escaping (UIView) -> Void) {
|
|
293
|
+
// guard let videoManager = videoManager else { return }
|
|
294
|
+
// videoManager.remoteView { previewView in
|
|
295
|
+
// DispatchQueue.main.async {
|
|
296
|
+
// if (previewView != nil) {
|
|
297
|
+
// previewView!.contentMode = .scaleAspectFill
|
|
298
|
+
// callback(previewView!)
|
|
299
|
+
// }
|
|
300
|
+
// }
|
|
301
|
+
// }
|
|
302
|
+
// }
|
|
360
303
|
}
|
|
361
304
|
|
|
362
305
|
|
|
@@ -10,21 +10,11 @@ import Foundation
|
|
|
10
10
|
|
|
11
11
|
let INIT_CALL = "INIT_CALL"
|
|
12
12
|
let UPDATE_TOKEN = "UPDATE_TOKEN"
|
|
13
|
-
let START_OMI_SERVICE = "START_OMI_SERVICE"
|
|
14
13
|
let START_CALL = "START_CALL"
|
|
14
|
+
let JOIN_CALL = "JOIN_CALL"
|
|
15
15
|
let END_CALL = "END_CALL"
|
|
16
16
|
let TOGGLE_MUTE = "TOGGLE_MUTE"
|
|
17
17
|
let TOGGLE_SPEAK = "TOGGLE_SPEAK"
|
|
18
|
-
let CHECK_ON_GOING_CALL = "CHECK_ON_GOING_CALL"
|
|
19
|
-
let DECLINE = "DECLINE"
|
|
20
|
-
let FORWARD_CALL_TO = "FORWARD_CALL_TO"
|
|
21
|
-
let HANGUP = "HANGUP"
|
|
22
|
-
let ON_CALL_STARTED = "ON_CALL_STARTED"
|
|
23
|
-
let ON_HOLD = "ON_HOLD"
|
|
24
|
-
let ON_IN_COMING_RECEIVE = "ON_IN_COMING_RECEIVE"
|
|
25
|
-
let ON_MUTE = "ON_MUTE"
|
|
26
|
-
let ON_OUT_GOING = "ON_OUT_GOING"
|
|
27
|
-
let ON_OUT_GOING_STARTED = "ON_OUT_GOING"
|
|
28
18
|
let REGISTER = "REGISTER"
|
|
29
19
|
let SEND_DTMF = "SEND_DTMF"
|
|
30
20
|
let SWITCH_CAMERA = "SWITCH_CAMERA"
|
|
@@ -36,12 +26,11 @@ let SETINPUT = "SET_INPUT"
|
|
|
36
26
|
let SETOUTPUT = "SET_OUTPUT"
|
|
37
27
|
|
|
38
28
|
//LISTENER
|
|
39
|
-
let onCallEstablished = "
|
|
40
|
-
let onCallEnd = "
|
|
41
|
-
let incomingReceived = "
|
|
42
|
-
let
|
|
43
|
-
let
|
|
44
|
-
let
|
|
45
|
-
let onMuted = "onMuted"
|
|
29
|
+
let onCallEstablished = "CALL_ESTABLISHED"
|
|
30
|
+
let onCallEnd = "CALL_END"
|
|
31
|
+
let incomingReceived = "INCOMING_RECEIVED"
|
|
32
|
+
let onConnectionTimeout = "CONNECTION_TIMEOUT"
|
|
33
|
+
let onSpeaker = "SPEAKER"
|
|
34
|
+
let onMuted = "MUTED"
|
|
46
35
|
|
|
47
36
|
|
package/ios/OmikitPlugin.m
CHANGED
|
@@ -2,22 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
@interface RCT_EXTERN_MODULE(OmikitPlugin, NSObject)
|
|
4
4
|
|
|
5
|
-
RCT_EXTERN_METHOD(
|
|
6
|
-
|
|
5
|
+
RCT_EXTERN_METHOD(getInitialCall:
|
|
6
|
+
(RCTPromiseResolveBlock)resolve
|
|
7
7
|
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
8
8
|
RCT_EXTERN_METHOD(initCall:(id)data
|
|
9
9
|
withResolver:(RCTPromiseResolveBlock)resolve
|
|
10
10
|
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
11
|
+
RCT_EXTERN_METHOD(updateToken:(id)data
|
|
12
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
13
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
11
14
|
RCT_EXTERN_METHOD(startCall:(id)data
|
|
12
15
|
withResolver:(RCTPromiseResolveBlock)resolve
|
|
13
16
|
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
17
|
+
RCT_EXTERN_METHOD(joinCall:
|
|
18
|
+
(RCTPromiseResolveBlock)resolve
|
|
19
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
14
20
|
RCT_EXTERN_METHOD(endCall:(RCTPromiseResolveBlock)resolve
|
|
15
21
|
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
16
22
|
RCT_EXTERN_METHOD(toggleMute:
|
|
17
23
|
(RCTPromiseResolveBlock)resolve
|
|
18
24
|
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
19
|
-
RCT_EXTERN_METHOD(toggleSpeak:
|
|
20
|
-
|
|
25
|
+
RCT_EXTERN_METHOD(toggleSpeak:
|
|
26
|
+
(RCTPromiseResolveBlock)resolve
|
|
21
27
|
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
22
28
|
RCT_EXTERN_METHOD(sendDTMF:(id)data
|
|
23
29
|
withResolver: (RCTPromiseResolveBlock)resolve
|
package/ios/OmikitPlugin.swift
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import React
|
|
3
|
+
import OmiKit
|
|
3
4
|
|
|
4
5
|
@objc(OmikitPlugin)
|
|
5
6
|
class OmikitPlugin: RCTEventEmitter {
|
|
@@ -10,7 +11,23 @@ class OmikitPlugin: RCTEventEmitter {
|
|
|
10
11
|
super.init()
|
|
11
12
|
OmikitPlugin.instance = self
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
+
|
|
15
|
+
@objc(getInitialCall:withRejecter:)
|
|
16
|
+
func getInitialCall(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
17
|
+
if let call = CallManager.shareInstance().getAvailableCall() {
|
|
18
|
+
let callerNumber = call.callerNumber
|
|
19
|
+
let status = call.lastStatus
|
|
20
|
+
let muted = call.muted
|
|
21
|
+
let data : [String: Any] = [
|
|
22
|
+
"callerNumber" : callerNumber,
|
|
23
|
+
"status": status,
|
|
24
|
+
"muted": muted
|
|
25
|
+
]
|
|
26
|
+
resolve(data)
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
resolve(false)
|
|
30
|
+
}
|
|
14
31
|
|
|
15
32
|
@objc(initCall:withResolver:withRejecter:)
|
|
16
33
|
func initCall(data: Any, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
@@ -32,32 +49,36 @@ class OmikitPlugin: RCTEventEmitter {
|
|
|
32
49
|
func startCall(data: Any, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
33
50
|
if let dataOmi = data as? [String: Any] {
|
|
34
51
|
let phoneNumber = dataOmi["phoneNumber"] as! String
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
CallManager.shareInstance().startCall(phoneNumber, isVideo: isVideo)
|
|
52
|
+
let isVideo = dataOmi["isVideo"] as? Bool
|
|
53
|
+
CallManager.shareInstance().startCall(phoneNumber, isVideo: isVideo ?? false)
|
|
54
|
+
sendOnMuteStatus()
|
|
40
55
|
resolve(true)
|
|
41
56
|
}
|
|
42
57
|
}
|
|
43
58
|
|
|
59
|
+
@objc(joinCall:withRejecter:)
|
|
60
|
+
func joinCall(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
61
|
+
CallManager.shareInstance().joinCall()
|
|
62
|
+
resolve(true)
|
|
63
|
+
}
|
|
64
|
+
|
|
44
65
|
@objc(endCall:withRejecter:)
|
|
45
66
|
func endCall(resolve:RCTPromiseResolveBlock, reject:RCTPromiseRejectBlock) -> Void {
|
|
46
|
-
CallManager.shareInstance().
|
|
67
|
+
CallManager.shareInstance().endAvailableCall()
|
|
47
68
|
resolve(true)
|
|
48
69
|
}
|
|
49
70
|
|
|
50
71
|
@objc(toggleMute:withRejecter:)
|
|
51
72
|
func toggleMute(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
52
|
-
CallManager.shareInstance().toggleMute
|
|
53
|
-
|
|
54
|
-
}
|
|
73
|
+
CallManager.shareInstance().toggleMute()
|
|
74
|
+
sendOnMuteStatus()
|
|
55
75
|
resolve(true)
|
|
56
76
|
}
|
|
57
77
|
|
|
58
|
-
@objc(toggleSpeak:
|
|
59
|
-
func toggleSpeak(
|
|
78
|
+
@objc(toggleSpeak:withRejecter:)
|
|
79
|
+
func toggleSpeak(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
|
|
60
80
|
CallManager.shareInstance().toogleSpeaker()
|
|
81
|
+
sendOnSpeakerStatus()
|
|
61
82
|
resolve(true)
|
|
62
83
|
}
|
|
63
84
|
|
|
@@ -69,14 +90,26 @@ class OmikitPlugin: RCTEventEmitter {
|
|
|
69
90
|
}
|
|
70
91
|
}
|
|
71
92
|
|
|
93
|
+
func sendOnMuteStatus() {
|
|
94
|
+
if let call = CallManager.shareInstance().getAvailableCall() {
|
|
95
|
+
if let isMuted = call.muted as? Bool {
|
|
96
|
+
print("muteeeeed \(isMuted)")
|
|
97
|
+
sendEvent(withName: onMuted, body: isMuted)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
func sendOnSpeakerStatus() {
|
|
103
|
+
sendEvent(withName: onSpeaker, body: CallManager.shareInstance().isSpeaker)
|
|
104
|
+
}
|
|
105
|
+
|
|
72
106
|
override func supportedEvents() -> [String]! {
|
|
73
107
|
return [
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"onRinging"
|
|
108
|
+
incomingReceived,
|
|
109
|
+
onCallEstablished,
|
|
110
|
+
onCallEnd,
|
|
111
|
+
onMuted,
|
|
112
|
+
onSpeaker
|
|
80
113
|
]
|
|
81
114
|
}
|
|
82
115
|
}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.OmiCallEvent = void 0;
|
|
6
7
|
exports.endCall = endCall;
|
|
8
|
+
exports.getInitialCall = getInitialCall;
|
|
7
9
|
exports.initCall = initCall;
|
|
10
|
+
exports.joinCall = joinCall;
|
|
8
11
|
exports.omiEmitter = void 0;
|
|
9
12
|
exports.onHold = onHold;
|
|
10
13
|
exports.sendDTMF = sendDTMF;
|
|
@@ -22,6 +25,9 @@ const OmikitPlugin = _reactNative.NativeModules.OmikitPlugin ? _reactNative.Nati
|
|
|
22
25
|
throw new Error(LINKING_ERROR);
|
|
23
26
|
}
|
|
24
27
|
});
|
|
28
|
+
function getInitialCall() {
|
|
29
|
+
return OmikitPlugin.getInitialCall();
|
|
30
|
+
}
|
|
25
31
|
function initCall(data) {
|
|
26
32
|
console.log(data);
|
|
27
33
|
return OmikitPlugin.initCall(data);
|
|
@@ -34,14 +40,17 @@ function startCall(data) {
|
|
|
34
40
|
console.log(data);
|
|
35
41
|
return OmikitPlugin.startCall(data);
|
|
36
42
|
}
|
|
43
|
+
function joinCall() {
|
|
44
|
+
return OmikitPlugin.joinCall();
|
|
45
|
+
}
|
|
37
46
|
function endCall() {
|
|
38
47
|
return OmikitPlugin.endCall();
|
|
39
48
|
}
|
|
40
49
|
function toggleMute() {
|
|
41
50
|
return OmikitPlugin.toggleMute();
|
|
42
51
|
}
|
|
43
|
-
function toggleSpeak(
|
|
44
|
-
return OmikitPlugin.toggleSpeak(
|
|
52
|
+
function toggleSpeak() {
|
|
53
|
+
return OmikitPlugin.toggleSpeak();
|
|
45
54
|
}
|
|
46
55
|
function onHold(data) {
|
|
47
56
|
return OmikitPlugin.onHold(data);
|
|
@@ -51,4 +60,12 @@ function sendDTMF(data) {
|
|
|
51
60
|
}
|
|
52
61
|
const omiEmitter = new _reactNative.NativeEventEmitter(OmikitPlugin);
|
|
53
62
|
exports.omiEmitter = omiEmitter;
|
|
63
|
+
const OmiCallEvent = {
|
|
64
|
+
onCallEstablished: 'CALL_ESTABLISHED',
|
|
65
|
+
onCallEnd: 'CALL_END',
|
|
66
|
+
incomingReceived: 'INCOMING_RECEIVED',
|
|
67
|
+
onSpeaker: 'SPEAKER',
|
|
68
|
+
onMuted: 'MUTED'
|
|
69
|
+
};
|
|
70
|
+
exports.OmiCallEvent = OmiCallEvent;
|
|
54
71
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","OmikitPlugin","NativeModules","Proxy","get","Error","initCall","data","console","log","updateToken","startCall","endCall","toggleMute","toggleSpeak","onHold","sendDTMF","omiEmitter","NativeEventEmitter","exports"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","OmikitPlugin","NativeModules","Proxy","get","Error","getInitialCall","initCall","data","console","log","updateToken","startCall","joinCall","endCall","toggleMute","toggleSpeak","onHold","sendDTMF","omiEmitter","NativeEventEmitter","exports","OmiCallEvent","onCallEstablished","onCallEnd","incomingReceived","onSpeaker","onMuted"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,MAAMC,aAAa,GAChB,wEAAuE,GACxEC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,YAAY,GAAGC,0BAAa,CAACD,YAAY,GAC3CC,0BAAa,CAACD,YAAY,GAC1B,IAAIE,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACT,aAAa,CAAC;EAChC;AACF,CAAC,CACF;AAEE,SAASU,cAAcA,CAAA,EAAiB;EAC7C,OAAOL,YAAY,CAACK,cAAc,EAAE;AACtC;AAEO,SAASC,QAAQA,CAACC,IAAS,EAAoB;EACpDC,OAAO,CAACC,GAAG,CAACF,IAAI,CAAC;EACjB,OAAOP,YAAY,CAACM,QAAQ,CAACC,IAAI,CAAC;AACpC;AAEO,SAASG,WAAWA,CAACH,IAAS,EAAiB;EACpDC,OAAO,CAACC,GAAG,CAACF,IAAI,CAAC;EACjB,OAAOP,YAAY,CAACU,WAAW,CAACH,IAAI,CAAC;AACvC;AAEO,SAASI,SAASA,CAACJ,IAAS,EAAoB;EACrDC,OAAO,CAACC,GAAG,CAACF,IAAI,CAAC;EACjB,OAAOP,YAAY,CAACW,SAAS,CAACJ,IAAI,CAAC;AACrC;AAEO,SAASK,QAAQA,CAAA,EAAqB;EAC3C,OAAOZ,YAAY,CAACY,QAAQ,EAAE;AAChC;AAEO,SAASC,OAAOA,CAAA,EAAqB;EAC1C,OAAOb,YAAY,CAACa,OAAO,EAAE;AAC/B;AAEO,SAASC,UAAUA,CAAA,EAAqB;EAC7C,OAAOd,YAAY,CAACc,UAAU,EAAE;AAClC;AAEO,SAASC,WAAWA,CAAA,EAAqB;EAC9C,OAAOf,YAAY,CAACe,WAAW,EAAE;AACnC;AAEO,SAASC,MAAMA,CAACT,IAAS,EAAoB;EAClD,OAAOP,YAAY,CAACgB,MAAM,CAACT,IAAI,CAAC;AAClC;AAEO,SAASU,QAAQA,CAACV,IAAS,EAAoB;EACpD,OAAOP,YAAY,CAACiB,QAAQ,CAACV,IAAI,CAAC;AACpC;AAEO,MAAMW,UAAU,GAAG,IAAIC,+BAAkB,CAACnB,YAAY,CAAC;AAACoB,OAAA,CAAAF,UAAA,GAAAA,UAAA;AAExD,MAAMG,YAAY,GAAG;EAC1BC,iBAAiB,EAAE,kBAAkB;EACrCC,SAAS,EAAE,UAAU;EACrBC,gBAAgB,EAAE,mBAAmB;EACrCC,SAAS,EAAE,SAAS;EACpBC,OAAO,EAAE;AACX,CAAC;AAACN,OAAA,CAAAC,YAAA,GAAAA,YAAA"}
|
package/lib/module/index.js
CHANGED
|
@@ -8,6 +8,9 @@ const OmikitPlugin = NativeModules.OmikitPlugin ? NativeModules.OmikitPlugin : n
|
|
|
8
8
|
throw new Error(LINKING_ERROR);
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
+
export function getInitialCall() {
|
|
12
|
+
return OmikitPlugin.getInitialCall();
|
|
13
|
+
}
|
|
11
14
|
export function initCall(data) {
|
|
12
15
|
console.log(data);
|
|
13
16
|
return OmikitPlugin.initCall(data);
|
|
@@ -20,14 +23,17 @@ export function startCall(data) {
|
|
|
20
23
|
console.log(data);
|
|
21
24
|
return OmikitPlugin.startCall(data);
|
|
22
25
|
}
|
|
26
|
+
export function joinCall() {
|
|
27
|
+
return OmikitPlugin.joinCall();
|
|
28
|
+
}
|
|
23
29
|
export function endCall() {
|
|
24
30
|
return OmikitPlugin.endCall();
|
|
25
31
|
}
|
|
26
32
|
export function toggleMute() {
|
|
27
33
|
return OmikitPlugin.toggleMute();
|
|
28
34
|
}
|
|
29
|
-
export function toggleSpeak(
|
|
30
|
-
return OmikitPlugin.toggleSpeak(
|
|
35
|
+
export function toggleSpeak() {
|
|
36
|
+
return OmikitPlugin.toggleSpeak();
|
|
31
37
|
}
|
|
32
38
|
export function onHold(data) {
|
|
33
39
|
return OmikitPlugin.onHold(data);
|
|
@@ -36,4 +42,11 @@ export function sendDTMF(data) {
|
|
|
36
42
|
return OmikitPlugin.sendDTMF(data);
|
|
37
43
|
}
|
|
38
44
|
export const omiEmitter = new NativeEventEmitter(OmikitPlugin);
|
|
45
|
+
export const OmiCallEvent = {
|
|
46
|
+
onCallEstablished: 'CALL_ESTABLISHED',
|
|
47
|
+
onCallEnd: 'CALL_END',
|
|
48
|
+
incomingReceived: 'INCOMING_RECEIVED',
|
|
49
|
+
onSpeaker: 'SPEAKER',
|
|
50
|
+
onMuted: 'MUTED'
|
|
51
|
+
};
|
|
39
52
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","Platform","NativeEventEmitter","LINKING_ERROR","select","ios","default","OmikitPlugin","Proxy","get","Error","initCall","data","console","log","updateToken","startCall","endCall","toggleMute","toggleSpeak","onHold","sendDTMF","omiEmitter"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,EAAEC,kBAAkB,QAAQ,cAAc;AAE1E,MAAMC,aAAa,GAChB,wEAAuE,GACxEF,QAAQ,CAACG,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,YAAY,GAAGP,aAAa,CAACO,YAAY,GAC3CP,aAAa,CAACO,YAAY,GAC1B,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CAAC,CACF;AAEL,OAAO,SAASQ,QAAQA,CAACC,IAAS,EAAoB;EACpDC,OAAO,CAACC,GAAG,CAACF,IAAI,CAAC;EACjB,
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","NativeEventEmitter","LINKING_ERROR","select","ios","default","OmikitPlugin","Proxy","get","Error","getInitialCall","initCall","data","console","log","updateToken","startCall","joinCall","endCall","toggleMute","toggleSpeak","onHold","sendDTMF","omiEmitter","OmiCallEvent","onCallEstablished","onCallEnd","incomingReceived","onSpeaker","onMuted"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,EAAEC,kBAAkB,QAAQ,cAAc;AAE1E,MAAMC,aAAa,GAChB,wEAAuE,GACxEF,QAAQ,CAACG,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,YAAY,GAAGP,aAAa,CAACO,YAAY,GAC3CP,aAAa,CAACO,YAAY,GAC1B,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CAAC,CACF;AAEL,OAAO,SAASQ,cAAcA,CAAA,EAAiB;EAC7C,OAAOJ,YAAY,CAACI,cAAc,EAAE;AACtC;AAEA,OAAO,SAASC,QAAQA,CAACC,IAAS,EAAoB;EACpDC,OAAO,CAACC,GAAG,CAACF,IAAI,CAAC;EACjB,OAAON,YAAY,CAACK,QAAQ,CAACC,IAAI,CAAC;AACpC;AAEA,OAAO,SAASG,WAAWA,CAACH,IAAS,EAAiB;EACpDC,OAAO,CAACC,GAAG,CAACF,IAAI,CAAC;EACjB,OAAON,YAAY,CAACS,WAAW,CAACH,IAAI,CAAC;AACvC;AAEA,OAAO,SAASI,SAASA,CAACJ,IAAS,EAAoB;EACrDC,OAAO,CAACC,GAAG,CAACF,IAAI,CAAC;EACjB,OAAON,YAAY,CAACU,SAAS,CAACJ,IAAI,CAAC;AACrC;AAEA,OAAO,SAASK,QAAQA,CAAA,EAAqB;EAC3C,OAAOX,YAAY,CAACW,QAAQ,EAAE;AAChC;AAEA,OAAO,SAASC,OAAOA,CAAA,EAAqB;EAC1C,OAAOZ,YAAY,CAACY,OAAO,EAAE;AAC/B;AAEA,OAAO,SAASC,UAAUA,CAAA,EAAqB;EAC7C,OAAOb,YAAY,CAACa,UAAU,EAAE;AAClC;AAEA,OAAO,SAASC,WAAWA,CAAA,EAAqB;EAC9C,OAAOd,YAAY,CAACc,WAAW,EAAE;AACnC;AAEA,OAAO,SAASC,MAAMA,CAACT,IAAS,EAAoB;EAClD,OAAON,YAAY,CAACe,MAAM,CAACT,IAAI,CAAC;AAClC;AAEA,OAAO,SAASU,QAAQA,CAACV,IAAS,EAAoB;EACpD,OAAON,YAAY,CAACgB,QAAQ,CAACV,IAAI,CAAC;AACpC;AAEA,OAAO,MAAMW,UAAU,GAAG,IAAItB,kBAAkB,CAACK,YAAY,CAAC;AAE9D,OAAO,MAAMkB,YAAY,GAAG;EAC1BC,iBAAiB,EAAE,kBAAkB;EACrCC,SAAS,EAAE,UAAU;EACrBC,gBAAgB,EAAE,mBAAmB;EACrCC,SAAS,EAAE,SAAS;EACpBC,OAAO,EAAE;AACX,CAAC"}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { NativeEventEmitter } from 'react-native';
|
|
2
|
+
export declare function getInitialCall(): Promise<any>;
|
|
2
3
|
export declare function initCall(data: any): Promise<boolean>;
|
|
3
4
|
export declare function updateToken(data: any): Promise<void>;
|
|
4
5
|
export declare function startCall(data: any): Promise<boolean>;
|
|
6
|
+
export declare function joinCall(): Promise<boolean>;
|
|
5
7
|
export declare function endCall(): Promise<boolean>;
|
|
6
8
|
export declare function toggleMute(): Promise<boolean>;
|
|
7
|
-
export declare function toggleSpeak(
|
|
9
|
+
export declare function toggleSpeak(): Promise<boolean>;
|
|
8
10
|
export declare function onHold(data: any): Promise<boolean>;
|
|
9
11
|
export declare function sendDTMF(data: any): Promise<boolean>;
|
|
10
12
|
export declare const omiEmitter: NativeEventEmitter;
|
|
13
|
+
export declare const OmiCallEvent: {
|
|
14
|
+
onCallEstablished: string;
|
|
15
|
+
onCallEnd: string;
|
|
16
|
+
incomingReceived: string;
|
|
17
|
+
onSpeaker: string;
|
|
18
|
+
onMuted: string;
|
|
19
|
+
};
|
|
11
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAmB3E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrD;AAED,wBAAgB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAE1C;AAED,wBAAgB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7C;AAED,wBAAgB,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAmB3E,wBAAgB,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,CAE7C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrD;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAE3C;AAED,wBAAgB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAE1C;AAED,wBAAgB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7C;AAED,wBAAgB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAElD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpD;AAED,eAAO,MAAM,UAAU,oBAAuC,CAAC;AAE/D,eAAO,MAAM,YAAY;;;;;;CAMxB,CAAC"}
|
package/package.json
CHANGED
package/src/index.tsx
CHANGED
|
@@ -17,6 +17,10 @@ const OmikitPlugin = NativeModules.OmikitPlugin
|
|
|
17
17
|
}
|
|
18
18
|
);
|
|
19
19
|
|
|
20
|
+
export function getInitialCall(): Promise<any> {
|
|
21
|
+
return OmikitPlugin.getInitialCall();
|
|
22
|
+
}
|
|
23
|
+
|
|
20
24
|
export function initCall(data: any): Promise<boolean> {
|
|
21
25
|
console.log(data);
|
|
22
26
|
return OmikitPlugin.initCall(data);
|
|
@@ -32,6 +36,10 @@ export function startCall(data: any): Promise<boolean> {
|
|
|
32
36
|
return OmikitPlugin.startCall(data);
|
|
33
37
|
}
|
|
34
38
|
|
|
39
|
+
export function joinCall(): Promise<boolean> {
|
|
40
|
+
return OmikitPlugin.joinCall();
|
|
41
|
+
}
|
|
42
|
+
|
|
35
43
|
export function endCall(): Promise<boolean> {
|
|
36
44
|
return OmikitPlugin.endCall();
|
|
37
45
|
}
|
|
@@ -40,8 +48,8 @@ export function toggleMute(): Promise<boolean> {
|
|
|
40
48
|
return OmikitPlugin.toggleMute();
|
|
41
49
|
}
|
|
42
50
|
|
|
43
|
-
export function toggleSpeak(
|
|
44
|
-
return OmikitPlugin.toggleSpeak(
|
|
51
|
+
export function toggleSpeak(): Promise<boolean> {
|
|
52
|
+
return OmikitPlugin.toggleSpeak();
|
|
45
53
|
}
|
|
46
54
|
|
|
47
55
|
export function onHold(data: any): Promise<boolean> {
|
|
@@ -53,3 +61,11 @@ export function sendDTMF(data: any): Promise<boolean> {
|
|
|
53
61
|
}
|
|
54
62
|
|
|
55
63
|
export const omiEmitter = new NativeEventEmitter(OmikitPlugin);
|
|
64
|
+
|
|
65
|
+
export const OmiCallEvent = {
|
|
66
|
+
onCallEstablished: 'CALL_ESTABLISHED',
|
|
67
|
+
onCallEnd: 'CALL_END',
|
|
68
|
+
incomingReceived: 'INCOMING_RECEIVED',
|
|
69
|
+
onSpeaker: 'SPEAKER',
|
|
70
|
+
onMuted: 'MUTED',
|
|
71
|
+
};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// NSUserActivity.swift
|
|
3
|
-
// Runner
|
|
4
|
-
//
|
|
5
|
-
// Created by Hien Nguyen on 20/02/2022.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
import Intents
|
|
10
|
-
|
|
11
|
-
extension NSUserActivity: StartCallConvertible {
|
|
12
|
-
|
|
13
|
-
public var handle: String? {
|
|
14
|
-
guard
|
|
15
|
-
let interaction = interaction,
|
|
16
|
-
let startCallIntent = interaction.intent as? SupportedStartCallIntent,
|
|
17
|
-
let contact = startCallIntent.contacts?.first
|
|
18
|
-
else {
|
|
19
|
-
return nil
|
|
20
|
-
}
|
|
21
|
-
print(interaction.intent)
|
|
22
|
-
return contact.personHandle?.value
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public var isVideo: Bool? {
|
|
26
|
-
guard
|
|
27
|
-
let interaction = interaction,
|
|
28
|
-
let startCallIntent = interaction.intent as? SupportedStartCallIntent
|
|
29
|
-
else {
|
|
30
|
-
return nil
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return startCallIntent is INStartVideoCallIntent
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
protocol StartCallConvertible {
|
|
40
|
-
var handle: String? { get }
|
|
41
|
-
var isVideo: Bool? { get }
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
extension StartCallConvertible {
|
|
45
|
-
|
|
46
|
-
var isVideo: Bool? {
|
|
47
|
-
return nil
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
protocol SupportedStartCallIntent {
|
|
54
|
-
var contacts: [INPerson]? { get }
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
extension INStartAudioCallIntent: SupportedStartCallIntent {}
|
|
58
|
-
extension INStartVideoCallIntent: SupportedStartCallIntent {}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import Foundation
|
|
3
|
-
|
|
4
|
-
extension String {
|
|
5
|
-
|
|
6
|
-
func fromBase64() -> String {
|
|
7
|
-
guard let data = Foundation.Data(base64Encoded: self) else {
|
|
8
|
-
return ""
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return String(data: data, encoding: .utf8)!
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
func toBase64() -> String {
|
|
15
|
-
return Foundation.Data(self.utf8).base64EncodedString()
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
}
|