Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 13 additions & 5 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -247,12 +247,20 @@ click listeners can be added using:
`overrideUrlClick`: keep it as true if you want to handle the url internally in your app. Else keep
it false if you want to open a browser when url is clicked.

```kotlin
config?.setUrlClickListener(object : LiveChatUrlClickListener {
override fun buttonClicked(url: String?) {
// Add the app logic for url click
### Chat Started Listener

Receive a callback when a new chat conversation has been started for the user.
This fires once the chat has been initiated and the backend has assigned a
`roomId` for the conversation. Use it to log analytics, persist the room
reference, or trigger any in-app behaviour that depends on a chat being live.

```kotlin
config?.setChatStartedListener(object : LiveChatStartedListener {
override fun onChatStarted(roomId: String?) {
// A new chat has started — `roomId` identifies this conversation
// Log.d("Chat Started","roomId = $roomId")
}
}, overrideUrlClick)
})
```

# User session management
Expand Down
18 changes: 16 additions & 2 deletions app/src/main/java/io/verloop/TestActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ import io.verloop.sdk.utils.NetworkUtils
import org.json.JSONException
import org.json.JSONObject
import android.net.Uri
import kotlin.math.log

class TestActivity : AppCompatActivity() {

private val TAG: String = "TestActivity"

var verloop: Verloop? = null
var verloop2: Verloop? = null

var headerConfig: HeaderConfig? = null

override fun onCreate(savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -149,7 +151,7 @@ class TestActivity : AppCompatActivity() {
.closeExistingChat(checkCloseExistingChat.isChecked)
.openMenuWidgetOnStart(openMenuWidgetOnStart.isChecked)
.overrideHeaderLayout(false)
.allowFileDownload(true)
.allowFileDownload(false)
.headerConfig(headerConfig)
.fields(customFields).build()

Expand All @@ -171,6 +173,7 @@ class TestActivity : AppCompatActivity() {
verloopConfig?.setButtonClickListener(object : LiveChatButtonClickListener {
override fun buttonClicked(title: String?, type: String?, payload: String?) {
if (type == "web_url"){
Log.d("URL",payload.toString())
try {
val jsonPayload = JSONObject(payload)
val url = jsonPayload.optString("url")
Expand All @@ -190,6 +193,16 @@ class TestActivity : AppCompatActivity() {
}
}
})
verloopConfig?.setChatStartedListener(object : LiveChatStartedListener{
override fun onChatStarted(roomId: String?) {
Log.d("Chat Started"," roomId = $roomId")
}
})
verloopConfig?.setRoomReadyListener(object : LiveChatRoomReadyListner{
override fun onRoomReady(roomId: String?) {
Log.d("Room Ready","roomId = $roomId")
}
})
verloop = Verloop(this, verloopConfig!!)
verloop?.showChat()
} catch (e: VerloopException) {
Expand Down Expand Up @@ -273,4 +286,5 @@ class TestActivity : AppCompatActivity() {
}
}
}
}
}

6 changes: 6 additions & 0 deletions sdk/src/main/java/io/verloop/sdk/LiveChatRoomReadyListner.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package io.verloop.sdk


fun interface LiveChatRoomReadyListner {
fun onRoomReady(roomId: String?)
}
5 changes: 5 additions & 0 deletions sdk/src/main/java/io/verloop/sdk/LiveChatStartedListener.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package io.verloop.sdk

fun interface LiveChatStartedListener {
fun onChatStarted(roomId: String?)
}
8 changes: 8 additions & 0 deletions sdk/src/main/java/io/verloop/sdk/Verloop.kt
Original file line number Diff line number Diff line change
Expand Up @@ -167,5 +167,13 @@ class Verloop(val context: Context, var verloopConfig: VerloopConfig) {
fun onLogEvent(logEvent: LogEvent) {
config.logEventListener?.logEvent(logEvent)
}

fun onChatStarted(roomId: String?) {
config.chatStartedListenerImpl?.onChatStarted(roomId)
}

fun onRoomReady(roomId: String?) {
config.roomReadyListenerImpl?.onRoomReady(roomId)
}
}
}
21 changes: 21 additions & 0 deletions sdk/src/main/java/io/verloop/sdk/VerloopConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ data class VerloopConfig private constructor(
var logLevel: LogLevel = LogLevel.WARNING

var buttonOnClickListener: LiveChatButtonClickListener? = null

var chatStartedListenerImpl: LiveChatStartedListener? = null

var roomReadyListenerImpl: LiveChatRoomReadyListner? = null

var chatUrlClickListener: LiveChatUrlClickListener? = null

var logEventListener: LiveLogEventListener? = null
Expand Down Expand Up @@ -75,6 +80,22 @@ data class VerloopConfig private constructor(
this.buttonOnClickListener = buttonOnClickListener
}

/**
* Callback for chat started
* @param chatStartedListener
*/
fun setChatStartedListener(listener: LiveChatStartedListener) {
this.chatStartedListenerImpl = listener // ← uses new name
}

/**
* Callback for chat started
* @param roomReadyListenerImpl
*/
fun setRoomReadyListener(listener: LiveChatRoomReadyListner) {
this.roomReadyListenerImpl = listener // ← uses new name
}

/**
* Callback for url click event from within the chat
* @param urlClickListener
Expand Down
27 changes: 27 additions & 0 deletions sdk/src/main/java/io/verloop/sdk/ui/VerloopFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,8 @@ class VerloopFragment : Fragment() {
ready()
} else if (params.getString("fn").equals("roomReady")) {
roomReady()
}else if (params.getString("fn").equals("callback")) {
handleCallback(params.optJSONArray("args"))
}
}

Expand Down Expand Up @@ -574,6 +576,31 @@ class VerloopFragment : Fragment() {
}
}

private fun handleCallback(args: org.json.JSONArray?) {
val eventName = args?.optString(0) ?: return
val payload = args.optJSONObject(1)
val roomId = payload?.optString("roomId", null)
when (eventName) {
"chat-started" -> callChatStarted(roomId)
"room-ready" -> callRoomReady(roomId)
// room-ready, chat-ended, etc. — add later as needed
}
}

private fun callChatStarted(roomId: String?){
logEvent(LogLevel.INFO, "ChatStarted", null)
Handler(Looper.getMainLooper()).post {
viewModel?.chatStarted(roomId)
}
}

private fun callRoomReady(roomId: String?){
logEvent(LogLevel.INFO, "Room Ready", null)
Handler(Looper.getMainLooper()).post {
viewModel?.roomReady(roomId)
}
}

private fun logEvent(level: LogLevel, message: String, params: JSONObject?) {
if (config?.logLevel?.ordinal!! >= level.ordinal) {
viewModel?.logEvent(LogEvent(level.name, message, params))
Expand Down
8 changes: 8 additions & 0 deletions sdk/src/main/java/io/verloop/sdk/viewmodel/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ class MainViewModel(var configKey: String?, var repository: VerloopRepository) :
}
}

fun chatStarted(roomId: String?) {
Verloop.eventListeners[configKey]?.onChatStarted(roomId)
}

fun roomReady(roomId: String?) {
Verloop.eventListeners[configKey]?.onRoomReady(roomId)
}

fun urlClicked(json: String) {
configKey.let {
Verloop.eventListeners[configKey]?.onURLClick(json)
Expand Down