@@ -2,6 +2,8 @@ package com.brightpattern.bpcontactcenter
22
33import android.os.Build
44import android.content.Context
5+ import android.graphics.Bitmap
6+ import android.util.Log
57import com.android.volley.Request
68import com.android.volley.VolleyError
79import com.android.volley.toolbox.HurlStack
@@ -17,16 +19,19 @@ import com.brightpattern.bpcontactcenter.model.ContactCenterServiceAvailability
1719import com.brightpattern.bpcontactcenter.model.ContactCenterVersion
1820import com.brightpattern.bpcontactcenter.model.http.ChatSessionCaseHistoryDto
1921import com.brightpattern.bpcontactcenter.model.http.ContactCenterEventsContainerDto
22+ import com.brightpattern.bpcontactcenter.model.ContactCenterUploadedFileInfo
2023import com.brightpattern.bpcontactcenter.network.NetworkService
2124import com.brightpattern.bpcontactcenter.network.URLProvider
2225import com.brightpattern.bpcontactcenter.network.support.HttpHeaderFields
2326import com.brightpattern.bpcontactcenter.network.support.HttpRequestDefaultParameters
2427import com.brightpattern.bpcontactcenter.utils.Failure
2528import com.brightpattern.bpcontactcenter.utils.Result
2629import com.brightpattern.bpcontactcenter.utils.Success
30+ import com.brightpattern.bpcontactcenter.utils.toBodyEncoded
2731import kotlinx.serialization.json.Json
2832import org.json.JSONException
2933import org.json.JSONObject
34+ import java.io.ByteArrayOutputStream
3035import java.net.HttpURLConnection
3136import java.net.URL
3237import java.util.*
@@ -156,6 +161,12 @@ class ContactCenterCommunicator private constructor(override val baseURL: String
156161 val url = URLProvider .Endpoint .GetChatHistory .generateFullUrl(baseURL, tenantURL, chatID)
157162 networkService.executeSimpleRequest(Request .Method .GET , url, defaultHttpHeaderFields, {
158163 val result = format.decodeFromString(ContactCenterEventsContainerDto .serializer(), it.toString())
164+ // Add URL for file events
165+ result.events.forEach { event ->
166+ (event as ? ContactCenterEvent .ChatSessionFile )?.let { message ->
167+ message.url = URLProvider .Endpoint .File .generateFileUrl(baseURL, message.fileUUID)
168+ }
169+ }
159170 completion.invoke(Success (result.events))
160171 }, {
161172 completion.invoke(Failure (parseVolleyError(it)))
@@ -172,6 +183,14 @@ class ContactCenterCommunicator private constructor(override val baseURL: String
172183 val url = URLProvider .Endpoint .GetCaseHistory .generateFullUrl(baseURL, tenantURL, chatID)
173184 networkService.executeSimpleRequest(Request .Method .GET , url, defaultHttpHeaderFields, {
174185 val list = format.decodeFromString(ChatSessionCaseHistoryDto .serializer(), it.toString())
186+ list.sessions.forEach { session ->
187+ // Add URL for file events
188+ session.events.forEach { event ->
189+ (event as ? ContactCenterEvent .ChatSessionFile )?.let { message ->
190+ message.url = URLProvider .Endpoint .File .generateFileUrl(baseURL, message.fileUUID)
191+ }
192+ }
193+ }
175194 completion.invoke(Success (list))
176195 }, {
177196 completion.invoke(Failure (parseVolleyError(it)))
@@ -217,22 +236,55 @@ class ContactCenterCommunicator private constructor(override val baseURL: String
217236 }
218237 }
219238
220- override fun sendChatMessage (chatID : String , content : String , format : ContactCenterCommunicating . ContentFormat , messageID : UUID ? , completion : (Result <String , Error >) -> Unit ) {
239+ override fun sendChatFile (chatID : String , fileID : String , fileName : String , fileType : String , completion : (Result <List < ContactCenterEvent . ChatSessionFile > , Error >) -> Unit ) {
221240 try {
222241 val url = URLProvider .Endpoint .SendEvents .generateFullUrl(baseURL, tenantURL, chatID)
242+ val chatSessionFile = ContactCenterEvent .ChatSessionFile (fileName, fileID, fileType, UUID .randomUUID().toString())
243+ val payload = createSendEventPayload(chatSessionFile)
244+ networkService.executeJsonRequest(Request .Method .POST , url, defaultHttpHeaderFields, payload, {
245+ chatSessionFile.url = URLProvider .Endpoint .File .generateFileUrl(baseURL, fileID)
246+ completion.invoke(Success (listOf (chatSessionFile)))
247+ }, {
248+ completion.invoke(Failure (parseVolleyError(it)))
249+ })
250+ } catch (e: ContactCenterError ) {
251+ completion.invoke(Failure (e))
252+ } catch (e: java.lang.Exception ) {
253+ completion.invoke(Failure (ContactCenterError .CommonCCError (e.toString())))
254+ }
255+ }
223256
224- var html = " " ;
225- var text = " " ;
257+ override fun uploadFile (fileName : String , image : Bitmap , completion : (Result <ContactCenterUploadedFileInfo , Error >) -> Unit ) {
258+ try {
259+
260+ val boundary = UUID .randomUUID().toString()
261+
262+ val bos = ByteArrayOutputStream ()
263+ image.compress(Bitmap .CompressFormat .JPEG , 80 , bos)
264+ val bitmapData = bos.toByteArray()
265+
266+ val url = URLProvider .Endpoint .UploadFile .generateFullUrl(baseURL, tenantURL)
226267
227- if (ContactCenterCommunicating .ContentFormat .TEXT == format) {
228- text = content
229- html = content.replace(" \n " , " <br>" )
230- }
231- else if (ContactCenterCommunicating .ContentFormat .HTML == format) {
232- html = content;
233- }
234268
235- val payload = createSendEventPayload(ContactCenterEvent .ChatSessionMessage (messageID.toString(), UUID .randomUUID().toString(), html, text))
269+ networkService.executeFileUpload(url, defaultHttpHeaderFields.fileUploadFields(boundary), bitmapData.toBodyEncoded(boundary, fileName),
270+ {
271+ val result = format.decodeFromString(ContactCenterUploadedFileInfo .serializer(), it.toString())
272+ completion.invoke((Success (result)))
273+ }, {
274+ completion.invoke(Failure (parseVolleyError(it)))
275+ })
276+
277+ } catch (e: ContactCenterError ) {
278+ completion.invoke(Failure (e))
279+ } catch (e: java.lang.Exception ) {
280+ completion.invoke(Failure (ContactCenterError .FileUploadError (e.toString())))
281+ }
282+ }
283+
284+ override fun sendChatMessage (chatID : String , message : String , messageID : UUID ? , completion : (Result <String , Error >) -> Unit ) {
285+ try {
286+ val url = URLProvider .Endpoint .SendEvents .generateFullUrl(baseURL, tenantURL, chatID)
287+ val payload = createSendEventPayload(ContactCenterEvent .ChatSessionMessage (messageID.toString(), UUID .randomUUID().toString(), message))
236288
237289 networkService.executeJsonRequest(Request .Method .POST , url, defaultHttpHeaderFields, payload, {
238290 completion.invoke(Success (it.toString()))
@@ -389,29 +441,49 @@ class ContactCenterCommunicator private constructor(override val baseURL: String
389441 }
390442 }
391443
444+ override fun sendSignalingData (chatID : String , partyID : String , messageID : Int , data : ContactCenterEvent .SignalingData , completion : (Result <Any , Error >) -> Unit ) {
445+
446+ try {
447+ val url = URLProvider .Endpoint .SendEvents .generateFullUrl(baseURL, tenantURL, chatID)
448+ val signalingEvent = ContactCenterEvent .ChatSessionSignaling (data, destination_party_id = partyID, msg_id = " $messageID " , party_id = partyID )
449+ val payload = createSendEventPayload(signalingEvent)
450+
451+ networkService.executeJsonRequest(Request .Method .POST , url, defaultHttpHeaderFields, payload, {
452+ completion.invoke(Success (it.toString()))
453+ }, {
454+ completion.invoke(Failure (parseVolleyError(it)))
455+ })
456+ } catch (e: ContactCenterError ) {
457+ completion.invoke(Failure (e))
458+ } catch (e: java.lang.Exception ) {
459+ completion.invoke(Failure (ContactCenterError .CommonCCError (e.toString())))
460+ }
461+
462+ }
463+
392464 private fun createRequestChatPayload (phoneNumber : String , from : String , parameters : JSONObject ): JSONObject {
393465 val payload = JSONObject ()
394466 payload.put(FieldName .PHONE_NUMBER , phoneNumber)
395467 payload.put(FieldName .FROM , from)
396468
397- var parms = parameters
398-
399- if (parms == null ) {
400- parms = JSONObject ()
401- }
469+ // if (parms == null) {
470+ // parms = JSONObject()
471+ // }
402472
403473 // Add system info
404474 val userPlatform = JSONObject ()
405475 userPlatform.put(" os" , Build .FINGERPRINT )
406476 userPlatform.put(" sdk" , Build .VERSION .SDK_INT )
407- userPlatform.put(" patch" , Build .VERSION .SECURITY_PATCH )
408477 userPlatform.put(" manufacturer" , Build .MANUFACTURER )
409478 userPlatform.put(" model" , Build .MODEL )
410479 userPlatform.put(" hardware" , Build .HARDWARE )
480+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
481+ userPlatform.put(" patch" , Build .VERSION .SECURITY_PATCH )
482+ }
411483
412- parms .put(" user_platform" , userPlatform)
484+ parameters .put(" user_platform" , userPlatform)
413485
414- payload.put(FieldName .PARAMETERS , parms )
486+ payload.put(FieldName .PARAMETERS , parameters )
415487
416488 return payload
417489 }
0 commit comments