From 85666d768a439ea7d73ee6775f585f853d196c67 Mon Sep 17 00:00:00 2001
From: isaacakakpo1 <134492608+isaacakakpo1@users.noreply.github.com>
Date: Thu, 24 Aug 2023 09:46:54 +0000
Subject: [PATCH] Is/feature/disable push (#319)
* Added Disable Push Notifications Functionality for Credential Login, To disable push notifications for the current user
* Added Disable Push Notifications Functionality for Token Login
* Fix Style for New Implementation
* Mock Username and Password Reset
---
.gitignore | 1 +
.idea/codeStyles/Project.xml | 9 ---
.idea/compiler.xml | 2 +-
.idea/misc.xml | 6 +-
app/.gitignore | 3 +-
.../com/telnyx/webrtc/sdk/ui/MainViewModel.kt | 4 +
.../main/java/com/telnyx/webrtc/sdk/Call.kt | 4 +
.../com/telnyx/webrtc/sdk/TelnyxClient.kt | 81 +++++++++++++++++++
.../telnyx/webrtc/sdk/model/SocketMethod.kt | 1 +
.../com/telnyx/webrtc/sdk/socket/TxSocket.kt | 14 ++++
.../webrtc/sdk/socket/TxSocketListener.kt | 7 ++
.../sdk/verto/receive/ReceivedResult.kt | 16 ++++
.../webrtc/sdk/verto/send/ParamRequest.kt | 22 +++++
13 files changed, 156 insertions(+), 14 deletions(-)
diff --git a/.gitignore b/.gitignore
index bffbf327..b0303499 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,6 +44,7 @@ captures/
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
+.idea/
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 3c7772a0..bdb2101f 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -8,15 +8,6 @@
-
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index fb7f4a8a..b589d56e 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 6e24b3a9..adb8ae0f 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,4 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
index 42afabfd..3af20ca4 100644
--- a/app/.gitignore
+++ b/app/.gitignore
@@ -1 +1,2 @@
-/build
\ No newline at end of file
+/build
+.idea/
diff --git a/app/src/main/java/com/telnyx/webrtc/sdk/ui/MainViewModel.kt b/app/src/main/java/com/telnyx/webrtc/sdk/ui/MainViewModel.kt
index d26bb365..299da2db 100644
--- a/app/src/main/java/com/telnyx/webrtc/sdk/ui/MainViewModel.kt
+++ b/app/src/main/java/com/telnyx/webrtc/sdk/ui/MainViewModel.kt
@@ -101,6 +101,10 @@ class MainViewModel @Inject constructor(
telnyxClient?.call?.acceptCall(callId, destinationNumber)
}
+ fun disablePushNotifications(sipUserName:String,fcmToken: String) {
+ telnyxClient?.disablePushNotification(sipUserName,null, fcmToken)
+ }
+
fun endCall(callId: UUID? = null) {
callId?.let {
telnyxClient?.call?.endCall(callId)
diff --git a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/Call.kt b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/Call.kt
index d8b21448..a2492290 100644
--- a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/Call.kt
+++ b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/Call.kt
@@ -576,6 +576,10 @@ class Call(
)
}
+ override fun onDisablePushReceived(jsonObject: JsonObject) {
+ // Noop
+ }
+
override fun onAttachReceived(jsonObject: JsonObject) {
Timber.d("[%s] :: onAttachReceived [%s]", this@Call.javaClass.simpleName, jsonObject)
val params = jsonObject.getAsJsonObject("params")
diff --git a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/TelnyxClient.kt b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/TelnyxClient.kt
index 8ef96542..6135ccc1 100644
--- a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/TelnyxClient.kt
+++ b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/TelnyxClient.kt
@@ -9,9 +9,11 @@ import android.media.AudioManager
import android.media.MediaPlayer
import android.net.ConnectivityManager
import android.os.PowerManager
+import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.*
import com.bugsnag.android.Bugsnag
+import com.google.gson.Gson
import com.google.gson.JsonObject
import com.telnyx.webrtc.sdk.model.*
import com.telnyx.webrtc.sdk.socket.TxSocket
@@ -341,6 +343,53 @@ class TelnyxClient(
socket.send(loginMessage)
}
+
+ /**
+ * Disables push notifications for current user
+ *
+ * Takes :
+ * @param sipUserName : sip username of the current user or
+ * @param loginToken : fcm token of the device
+ * @param fcmToken : fcm token of the device
+ * NB : Push Notifications are enabled by default after login
+ *
+ * returns : {"jsonrpc":"2.0","id":"","result":{"message":"disable push notification success"}}
+ * */
+ fun disablePushNotification(sipUserName: String?, loginToken: String?, fcmToken: String) {
+
+ sipUserName ?: loginToken ?: return
+
+ val params = when {
+ sipUserName == null -> {
+ TokenDisablePushParams(
+ loginToken = loginToken!!,
+ userVariables = UserVariables(fcmToken)
+ )
+ }
+
+ loginToken == null -> {
+ DisablePushParams(
+ user = sipUserName,
+ userVariables = UserVariables(fcmToken)
+ )
+ }
+
+ else -> {
+ return
+ }
+ }
+
+ val disablePushMessage = SendingMessageBody(
+ id = UUID.randomUUID().toString(),
+ method = SocketMethod.DISABLE_PUSH.methodName,
+ params = params
+ )
+ val message = Gson().toJson(disablePushMessage)
+ Log.d("disablePushMessage", message)
+ socket.send(disablePushMessage)
+ }
+
+
/**
* Logs the user in with credentials provided via TokenConfig
*
@@ -429,6 +478,7 @@ class TelnyxClient(
)
}
}
+
AudioDevice.PHONE_EARPIECE -> {
// For phone ear piece
audioManager?.mode = AudioManager.MODE_IN_COMMUNICATION
@@ -436,6 +486,7 @@ class TelnyxClient(
audioManager?.isBluetoothScoOn = false
audioManager?.isSpeakerphoneOn = false
}
+
AudioDevice.LOUDSPEAKER -> {
// For phone speaker(loudspeaker)
audioManager?.mode = AudioManager.MODE_NORMAL
@@ -605,14 +656,17 @@ class TelnyxClient(
onLoginSuccessful(sessid)
}
}
+
GatewayState.NOREG.state -> {
invalidateGatewayResponseTimer()
socketResponseLiveData.postValue(SocketResponse.error("Gateway registration has timed out"))
}
+
GatewayState.FAILED.state -> {
invalidateGatewayResponseTimer()
socketResponseLiveData.postValue(SocketResponse.error("Gateway registration has failed"))
}
+
GatewayState.FAIL_WAIT.state -> {
if (autoReconnectLogin && connectRetryCounter < RETRY_CONNECT_TIME) {
connectRetryCounter++
@@ -626,22 +680,28 @@ class TelnyxClient(
socketResponseLiveData.postValue(SocketResponse.error("Gateway registration has received fail wait response"))
}
}
+
GatewayState.EXPIRED.state -> {
invalidateGatewayResponseTimer()
socketResponseLiveData.postValue(SocketResponse.error("Gateway registration has timed out"))
}
+
GatewayState.UNREGED.state -> {
// NOOP - logged within TxSocket
}
+
GatewayState.TRYING.state -> {
// NOOP - logged within TxSocket
}
+
GatewayState.REGISTER.state -> {
// NOOP - logged within TxSocket
}
+
GatewayState.UNREGISTER.state -> {
// NOOP - logged within TxSocket
}
+
else -> {
invalidateGatewayResponseTimer()
socketResponseLiveData.postValue(SocketResponse.error("Gateway registration has failed with an unknown error"))
@@ -709,6 +769,27 @@ class TelnyxClient(
call?.onIceCandidateReceived(iceCandidate)
}
+ override fun onDisablePushReceived(jsonObject: JsonObject) {
+ Timber.d(
+ "[%s] :: onDisablePushReceived [%s]",
+ this@TelnyxClient.javaClass.simpleName,
+ jsonObject
+ )
+ val errorMessage = jsonObject.get("result").asJsonObject.get("message").asString
+ val disablePushResponse = DisablePushResponse(
+ errorMessage.contains(DisablePushResponse.SUCCESS_KEY),
+ errorMessage
+ )
+ socketResponseLiveData.postValue(
+ SocketResponse.messageReceived(
+ ReceivedMessageBody(
+ SocketMethod.RINGING.methodName,
+ disablePushResponse
+ )
+ )
+ )
+ }
+
override fun onAttachReceived(jsonObject: JsonObject) {
call?.onAttachReceived(jsonObject)
}
diff --git a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/model/SocketMethod.kt b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/model/SocketMethod.kt
index 6b5ce65c..aaf26df7 100644
--- a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/model/SocketMethod.kt
+++ b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/model/SocketMethod.kt
@@ -31,5 +31,6 @@ enum class SocketMethod(var methodName: String) {
PINGPONG("telnyx_rtc.ping"),
CLIENT_READY("telnyx_rtc.clientReady"),
GATEWAY_STATE("telnyx_rtc.gatewayState"),
+ DISABLE_PUSH("telnyx_rtc.disable_push_notification"),
LOGIN("login")
}
diff --git a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/socket/TxSocket.kt b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/socket/TxSocket.kt
index 2e6703a9..372985cc 100644
--- a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/socket/TxSocket.kt
+++ b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/socket/TxSocket.kt
@@ -127,6 +127,7 @@ class TxSocket(
}
}
}
+
params !== null && params.asJsonObject.has("state") -> {
params = jsonObject.get("params").asJsonObject
if (params.asJsonObject.has("state")) {
@@ -134,6 +135,7 @@ class TxSocket(
listener.onGatewayStateReceived(gatewayState, null)
}
}
+
jsonObject.has("method") -> {
Timber.tag("VERTO").d(
"[%s] Received Method [%s]",
@@ -144,18 +146,23 @@ class TxSocket(
CLIENT_READY.methodName -> {
listener.onClientReady(jsonObject)
}
+
ATTACH.methodName -> {
listener.onAttachReceived(jsonObject)
}
+
INVITE.methodName -> {
listener.onOfferReceived(jsonObject)
}
+
ANSWER.methodName -> {
listener.onAnswerReceived(jsonObject)
}
+
MEDIA.methodName -> {
listener.onMediaReceived(jsonObject)
}
+
BYE.methodName -> {
val params =
jsonObject.getAsJsonObject("params")
@@ -163,13 +170,18 @@ class TxSocket(
UUID.fromString(params.get("callID").asString)
listener.onByeReceived(callId)
}
+
INVITE.methodName -> {
listener.onOfferReceived(jsonObject)
}
+
RINGING.methodName -> {
listener.onRingingReceived(jsonObject)
}
+ DISABLE_PUSH.methodName -> {
+ listener.onDisablePushReceived(jsonObject)
+ }
PINGPONG.methodName -> {
isPing = true
webSocket.send(text)
@@ -177,6 +189,7 @@ class TxSocket(
}
}
}
+
jsonObject.has("error") -> {
if (jsonObject.get("error").asJsonObject.has("code")) {
val errorCode =
@@ -191,6 +204,7 @@ class TxSocket(
CREDENTIAL_ERROR.errorCode -> {
listener.onErrorReceived(jsonObject)
}
+
TOKEN_ERROR.errorCode -> {
listener.onErrorReceived(jsonObject)
}
diff --git a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/socket/TxSocketListener.kt b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/socket/TxSocketListener.kt
index 4d15b1b8..d7610742 100644
--- a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/socket/TxSocketListener.kt
+++ b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/socket/TxSocketListener.kt
@@ -83,6 +83,13 @@ interface TxSocketListener {
*/
fun onIceCandidateReceived(iceCandidate: IceCandidate)
+ /**
+ * Fires when a disablePush response is recieved
+ * @param jsonObject, the socket response in a jsonObject format
+ * @see [IceCandidate]
+ */
+ fun onDisablePushReceived(jsonObject: JsonObject)
+
/**
* Fires once a connection has been reestablished during an ongoing call and a session
* is being reattached
diff --git a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/verto/receive/ReceivedResult.kt b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/verto/receive/ReceivedResult.kt
index 115e7fa4..27ff594f 100644
--- a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/verto/receive/ReceivedResult.kt
+++ b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/verto/receive/ReceivedResult.kt
@@ -4,6 +4,7 @@
package com.telnyx.webrtc.sdk.verto.receive
+import android.os.Parcel
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.android.parcel.Parcelize
@@ -14,6 +15,21 @@ import java.util.*
*/
sealed class ReceivedResult
+
+@Parcelize
+data class DisablePushResponse(
+ @SerializedName("message")
+ val success: Boolean,
+ @SerializedName("message")
+ val message: String
+) : ReceivedResult(), Parcelable {
+
+ companion object {
+ // Refactor for backend to send a boolean instead of a string
+ const val SUCCESS_KEY = "success"
+ }
+}
+
/**
* A login response received by the socket connection
*
diff --git a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/verto/send/ParamRequest.kt b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/verto/send/ParamRequest.kt
index 083871c1..6ca68d1c 100644
--- a/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/verto/send/ParamRequest.kt
+++ b/telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/verto/send/ParamRequest.kt
@@ -34,6 +34,28 @@ data class ByeParams(
val dialogParams: ByeDialogParams
) : ParamRequest()
+
+data class DisablePushParams(
+ @SerializedName("user")
+ val user: String,
+ @SerializedName("User-Agent")
+ val userVariables: UserVariables
+) : ParamRequest()
+
+data class TokenDisablePushParams(
+ @SerializedName("login_token")
+ val loginToken: String,
+ @SerializedName("User-Agent")
+ val userVariables: UserVariables
+) : ParamRequest()
+
+data class UserVariables(
+ @SerializedName("push_device_token")
+ val pushDeviceToken:String,
+ @SerializedName("push_notification_provider")
+ val pushNotificationProvider:String = "android",
+)
+
data class ModifyParams(
val sessid: String,
val action: String,