Skip to content

Commit 0ac0ef4

Browse files
authored
Is/enh/speaker mode fix (#343)
* Update build.gradle * Speaker Mode Fix * Speaker Mode Fix * Fix. Creds
1 parent dca2121 commit 0ac0ef4

File tree

4 files changed

+65
-21
lines changed

4 files changed

+65
-21
lines changed

app/src/main/java/com/telnyx/webrtc/sdk/ui/MainActivity.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,10 @@ class MainActivity : AppCompatActivity() {
213213
SocketMethod.BYE.methodName -> {
214214
onByeReceivedViews()
215215
val callId = (data.result as ByeResponse).callId
216-
supportFragmentManager.beginTransaction().remove(callInstanceFragment!!).commit()
216+
val callInstanceFragment = callInstanceFragments[callId]
217+
callInstanceFragment?.let {
218+
supportFragmentManager.beginTransaction().remove(it).commit()
219+
}
217220
}
218221
}
219222
}
@@ -362,6 +365,8 @@ class MainActivity : AppCompatActivity() {
362365
}
363366

364367
private fun mockInputs() {
368+
sip_username_id.setText(MOCK_USERNAME)
369+
sip_password_id.setText(MOCK_PASSWORD)
365370
caller_id_name_id.setText(MOCK_CALLER_NAME)
366371
caller_id_number_id.setText(MOCK_CALLER_NUMBER)
367372
call_input_id.setText(MOCK_DESTINATION_NUMBER)
@@ -500,15 +505,13 @@ class MainActivity : AppCompatActivity() {
500505
}
501506
}
502507

503-
private var callInstanceFragment: CallInstanceFragment? = null
508+
private val callInstanceFragments = mutableMapOf<UUID, CallInstanceFragment>()
504509
private fun launchCallInstance(callId: UUID) {
505510
mainViewModel.setCurrentCall(callId)
506-
if (callInstanceFragment != null) {
507-
supportFragmentManager.beginTransaction().remove(callInstanceFragment!!).commit()
508-
}
509-
callInstanceFragment = CallInstanceFragment.newInstance(callId.toString())
511+
val callInstanceFragment = CallInstanceFragment.newInstance(callId.toString())
512+
callInstanceFragments[callId] = callInstanceFragment
510513
supportFragmentManager.beginTransaction()
511-
.add(R.id.fragment_call_instance, callInstanceFragment!!)
514+
.add(R.id.fragment_call_instance, callInstanceFragment)
512515
.commit()
513516
}
514517

app/src/main/java/com/telnyx/webrtc/sdk/ui/MainViewModel.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class MainViewModel @Inject constructor(
8080
if (calls.size > 1) {
8181
previousCall = currentCall
8282
}
83-
currentCall = calls[callId]
83+
currentCall = calls[callId]!!
8484
}
8585

8686
fun getCallState(): LiveData<CallState>? = currentCall?.getCallState()
@@ -124,10 +124,9 @@ class MainViewModel @Inject constructor(
124124

125125
fun endCall(callId: UUID? = null) {
126126
callId?.let {
127-
telnyxClient?.call?.endCall(callId)
127+
telnyxClient?.endCall(callId)
128128
} ?: run {
129-
val clientCallId = telnyxClient?.call?.callId
130-
clientCallId?.let { telnyxClient?.call?.endCall(it) }
129+
currentCall?.endCall(currentCall?.callId!!)
131130
}
132131
previousCall?.let {
133132
currentCall = it
@@ -143,6 +142,7 @@ class MainViewModel @Inject constructor(
143142
}
144143

145144
fun onLoudSpeakerPressed() {
145+
Timber.e("onLoudSpeakerPressed ${currentCall?.callId}")
146146
currentCall?.onLoudSpeakerPressed()
147147
}
148148

telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/Call.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,6 @@ data class Call(
8181
private val loudSpeakerLiveData = MutableLiveData(false)
8282

8383
init {
84-
if (!BuildConfig.IS_TESTING.get()) {
85-
if (audioManager.mode != AudioManager.MODE_IN_COMMUNICATION) {
86-
audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
87-
}
88-
}
89-
9084
callStateLiveData.postValue(CallState.CONNECTING)
9185
// Ensure that loudSpeakerLiveData is correct based on possible options provided from client.
9286
loudSpeakerLiveData.postValue(audioManager.isSpeakerphoneOn)
@@ -198,15 +192,22 @@ data class Call(
198192
* @see [AudioManager]
199193
*/
200194
fun onLoudSpeakerPressed() {
201-
if (!loudSpeakerLiveData.value!!) {
195+
if (!audioManager.isSpeakerphoneOn) {
202196
loudSpeakerLiveData.postValue(true)
203197
audioManager.isSpeakerphoneOn = true
204198
} else {
205199
loudSpeakerLiveData.postValue(false)
206200
audioManager.isSpeakerphoneOn = false
207201
}
202+
Timber.e("audioManager.isSpeakerphoneOn ${audioManager.isSpeakerphoneOn}")
208203
}
209204

205+
fun getLoudSpeakerStatus(): Boolean {
206+
return loudSpeakerLiveData.value!!
207+
}
208+
209+
210+
210211
/**
211212
* Either places a call on hold, or unholds a call based on the current [holdLiveData] value
212213
* @param callId, the unique UUID of the call you want to place or remove from hold with the [sendHoldModifier] method

telnyx_rtc/src/main/java/com/telnyx/webrtc/sdk/TelnyxClient.kt

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ class TelnyxClient(
4848
URI
4949
}
5050

51+
/*
52+
* Add Later: Support current audio device i.e speaker or earpiece or bluetooth for incoming calls
53+
* */
54+
enum class SpeakerMode {
55+
SPEAKER,
56+
EARPIECE,
57+
UNASSIGNED
58+
}
59+
5160
companion object {
5261
const val RETRY_REGISTER_TIME = 3
5362
const val RETRY_CONNECT_TIME = 3
@@ -66,6 +75,7 @@ class TelnyxClient(
6675
private var registrationRetryCounter = 0
6776
private var connectRetryCounter = 0
6877
private var gatewayState = "idle"
78+
private var speakerState: SpeakerMode = SpeakerMode.UNASSIGNED
6979

7080
internal var socket: TxSocket
7181
private var providedHostAddress: String? = null
@@ -164,10 +174,13 @@ class TelnyxClient(
164174
)
165175
socket.send(answerBodyMessage)
166176
client.stopMediaPlayer()
177+
// reset audio mode to communication
178+
speakerState?.let { setSpeakerMode(it) }
179+
180+
167181
callStateLiveData.postValue(CallState.ACTIVE)
168182
client.callOngoing()
169-
// reset audio mode to communication
170-
audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
183+
171184
}
172185
}
173186
this.addToCalls(acceptCall)
@@ -733,15 +746,29 @@ class TelnyxClient(
733746
}
734747
}
735748

749+
736750
/**
737751
* Use MediaPlayer to play the audio of the saved user Ringtone
738752
* If no ringtone was provided, we print a relevant message
739753
*
740754
* @see [MediaPlayer]
741755
*/
742756
internal fun playRingtone() {
757+
// set speakerState to current audioManager settings
758+
speakerState = if (speakerState != SpeakerMode.UNASSIGNED) {
759+
if (audioManager?.isSpeakerphoneOn == true) {
760+
SpeakerMode.SPEAKER
761+
} else {
762+
SpeakerMode.EARPIECE
763+
}
764+
}else{
765+
SpeakerMode.EARPIECE
766+
}
767+
768+
// set audioManager to ringtone settings
743769
audioManager?.mode = AudioManager.MODE_RINGTONE
744770
audioManager?.isSpeakerphoneOn = true
771+
745772
rawRingtone?.let {
746773
stopMediaPlayer()
747774
try {
@@ -769,6 +796,19 @@ class TelnyxClient(
769796
}
770797
}
771798

799+
private fun setSpeakerMode(speakerMode: SpeakerMode) {
800+
when (speakerMode) {
801+
SpeakerMode.SPEAKER -> {
802+
audioManager?.isSpeakerphoneOn = true
803+
}
804+
SpeakerMode.EARPIECE -> {
805+
audioManager?.isSpeakerphoneOn = false
806+
}
807+
808+
SpeakerMode.UNASSIGNED -> audioManager?.isSpeakerphoneOn = false
809+
}
810+
}
811+
772812
private fun Any?.getRingtoneType(): RingtoneType? {
773813
return when (this) {
774814
is Uri -> RingtoneType.URI
@@ -783,7 +823,7 @@ class TelnyxClient(
783823
*
784824
* @see [MediaPlayer]
785825
*/
786-
internal fun playRingBackTone() {
826+
private fun playRingBackTone() {
787827
rawRingbackTone?.let {
788828
stopMediaPlayer()
789829
mediaPlayer = MediaPlayer.create(context, it)

0 commit comments

Comments
 (0)