Skip to content

Commit 29f4248

Browse files
authored
Merge pull request #92 from raghsund/3.14
Release 3.14
2 parents 773f129 + 49f35e9 commit 29f4248

11 files changed

Lines changed: 194 additions & 20 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,19 @@ This demo support Android device with **Android 7.0** or later
7979
- For Full SDK
8080
```
8181
dependencies {
82-
implementation 'com.ciscowebex:webexsdk:3.13.0'
82+
implementation 'com.ciscowebex:webexsdk:3.14.0'
8383
}
8484
```
8585
- For Meeting SDK
8686
```
8787
dependencies {
88-
implementation 'com.ciscowebex:webexsdk-meeting:3.13.0'
88+
implementation 'com.ciscowebex:webexsdk-meeting:3.14.0'
8989
}
9090
```
9191
- For WebexCalling SDK
9292
```
9393
dependencies {
94-
implementation 'com.ciscowebex:webexsdk-wxc:3.13.0'
94+
implementation 'com.ciscowebex:webexsdk-wxc:3.14.0'
9595
}
9696
```
9797

app/build.gradle

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ android {
3232
applicationId "com.cisco.sdk_android"
3333
minSdkVersion Versions.minSdk
3434
targetSdkVersion Versions.targetSdk
35-
versionCode 3130000
36-
versionName "3.13.0"
35+
versionCode 3140000
36+
versionName "3.14.0"
3737

3838
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
3939

@@ -121,9 +121,9 @@ android {
121121

122122
dependencies {
123123
//At a time only one WebexSDK should be used.
124-
implementation 'com.ciscowebex:webexsdk:3.13.0' // For full flavor
125-
//implementation 'com.ciscowebex:webexsdk-wxc:3.13.0' //For webexCalling flavor
126-
//implementation 'com.ciscowebex:webexsdk-meeting:3.13.0' // For meeting flavor
124+
implementation 'com.ciscowebex:webexsdk:3.14.0' // For full flavor
125+
//implementation 'com.ciscowebex:webexsdk-wxc:3.14.0' //For webexCalling flavor
126+
//implementation 'com.ciscowebex:webexsdk-meeting:3.14.0' // For meeting flavor
127127
implementation fileTree(dir: "libs", include: ["*.jar"])
128128
implementation Dependencies.kotlinStdLib
129129
implementation Dependencies.coreKtx

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/WebexRepository.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ class WebexRepository(val webex: Webex) : WebexUCLoginDelegate, WebexAuthDelegat
109109
InCorrectPasswordOrHostKey,
110110
InCorrectPasswordOrHostKeyWithCaptcha,
111111
WrongApiCalled,
112-
CannotStartInstantMeeting
112+
CannotStartInstantMeeting,
113+
NonExistentCallPull
113114
}
114115

115116
enum class CalendarMeetingEvent {
@@ -141,6 +142,8 @@ class WebexRepository(val webex: Webex) : WebexUCLoginDelegate, WebexAuthDelegat
141142
var enablePhoneStatePermission = true
142143
var enableHWAcceltoggle = false
143144
var multiStreamNewApproach = true
145+
var enableLegacyNoiseRemoval = false
146+
var enableSpeechEnhancement = false
144147
var logFilter = LogLevel.ALL.name
145148
var maxVideoBandwidth = BandWidthOptions.BANDWIDTH_720P.name
146149
var isConsoleLoggerEnabled = true

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/WebexViewModel.kt

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import com.ciscowebex.androidsdk.phone.PhoneConnectionResult
5252
import com.ciscowebex.androidsdk.phone.ReceivingNoiseInfo
5353
import com.ciscowebex.androidsdk.phone.ReceivingNoiseRemovalEnableResult
5454
import com.ciscowebex.androidsdk.phone.ReclaimHostError
55+
import com.ciscowebex.androidsdk.phone.SpeechEnhancementResult
5556
import com.ciscowebex.androidsdk.phone.annotation.LiveAnnotationListener
5657
import com.ciscowebex.androidsdk.phone.annotation.LiveAnnotationsPolicy
5758
import com.ciscowebex.androidsdk.phone.closedCaptions.CaptionItem
@@ -275,6 +276,18 @@ class WebexViewModel(val webex: Webex, val repository: WebexRepository) : BaseVi
275276
repository.multiStreamNewApproach = value
276277
}
277278

279+
var enableLegacyNoiseRemoval: Boolean
280+
get() = repository.enableLegacyNoiseRemoval
281+
set(value) {
282+
repository.enableLegacyNoiseRemoval = value
283+
}
284+
285+
var enableSpeechEnhancement: Boolean
286+
get() = repository.enableSpeechEnhancement
287+
set(value) {
288+
repository.enableSpeechEnhancement = value
289+
}
290+
278291
init {
279292
repository._callMembershipsLiveData = _callMembershipsLiveData
280293
repository._ucLiveData = _ucLiveData
@@ -386,6 +399,11 @@ class WebexViewModel(val webex: Webex, val repository: WebexRepository) : BaseVi
386399
WebexError.ErrorCode.INVALID_API_ERROR.code -> {
387400
_callingLiveData.postValue(WebexRepository.CallLiveData(WebexRepository.CallEvent.WrongApiCalled, null, null, result.error?.errorMessage))
388401
}
402+
WebexError.ErrorCode.UNEXPECTED_ERROR.code -> {
403+
if(error.errorMessage == "NonExistentCallPull") {
404+
_callingLiveData.postValue(WebexRepository.CallLiveData(WebexRepository.CallEvent.NonExistentCallPull, null, null, result.error?.errorMessage))
405+
}
406+
}
389407
else -> {
390408
_callingLiveData.postValue(WebexRepository.CallLiveData(WebexRepository.CallEvent.DialFailed, null, null, result.error?.errorMessage))
391409
}
@@ -411,6 +429,11 @@ class WebexViewModel(val webex: Webex, val repository: WebexRepository) : BaseVi
411429
result.error?.let { error ->
412430

413431
when(error.errorCode){
432+
WebexError.ErrorCode.UNEXPECTED_ERROR.code -> {
433+
if(error.errorMessage == "NonExistentCallPull") {
434+
_callingLiveData.postValue(WebexRepository.CallLiveData(WebexRepository.CallEvent.NonExistentCallPull, null, null, result.error?.errorMessage))
435+
}
436+
}
414437
WebexError.ErrorCode.HOST_PIN_OR_MEETING_PASSWORD_REQUIRED.code -> {
415438
_callingLiveData.postValue(WebexRepository.CallLiveData(WebexRepository.CallEvent.MeetingPinOrPasswordRequired, null))
416439
}
@@ -1500,8 +1523,27 @@ class WebexViewModel(val webex: Webex, val repository: WebexRepository) : BaseVi
15001523
}
15011524
}
15021525

1503-
15041526
fun isRecordingAudioDump(): Boolean {
15051527
return getCall(currentCallId.orEmpty())?.isRecordingAudioDump() ?: false
15061528
}
1529+
1530+
fun useLegacyReceiverNoiseRemoval(enable: Boolean) {
1531+
webex.phone.useLegacyReceiverNoiseRemoval(enable)
1532+
}
1533+
1534+
fun isReceiverSpeechEnhancementEnabledByDefault(): Boolean {
1535+
return webex.phone.isReceiverSpeechEnhancementEnabled()
1536+
}
1537+
1538+
fun enableReceiverSpeechEnhancementByDefault(enable: Boolean, callback: CompletionHandler<Void>) {
1539+
webex.phone.enableReceiverSpeechEnhancement(enable, callback)
1540+
}
1541+
1542+
fun isReceiverSpeechEnhancementEnabled(): Boolean {
1543+
return getCall(currentCallId.orEmpty())?.isReceiverSpeechEnhancementEnabled() ?: false
1544+
}
1545+
1546+
fun enableReceiverSpeechEnhancement(enable: Boolean, callback: CompletionHandler<Void>) {
1547+
getCall(currentCallId.orEmpty())?.enableReceiverSpeechEnhancement(enable, callback)
1548+
}
15071549
}

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/calling/CallBottomSheetFragment.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.ciscowebex.androidsdk.kitchensink.databinding.BottomSheetCallOptionsB
99
import com.ciscowebex.androidsdk.phone.Call
1010
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
1111
import com.ciscowebex.androidsdk.kitchensink.R
12+
import com.ciscowebex.androidsdk.kitchensink.WebexViewModel
1213
import com.ciscowebex.androidsdk.phone.MediaOption
1314
import com.ciscowebex.androidsdk.phone.Phone
1415

@@ -29,7 +30,8 @@ class CallBottomSheetFragment(val showIncomingCallsClickListener: (Call?) -> Uni
2930
val claimHostClickListener: () -> Unit,
3031
val showBreakoutSessions: () -> Unit,
3132
val closedCaptionOptions: (Call?) -> Unit,
32-
val startAudioDumpListener: () -> Unit): BottomSheetDialogFragment() {
33+
val startAudioDumpListener: () -> Unit,
34+
val toggleReceiverSpeechEnhancement: () -> Unit, val webexViewModel: WebexViewModel): BottomSheetDialogFragment() {
3335
companion object {
3436
val TAG = "CallBottomSheetFragment"
3537
}
@@ -233,6 +235,13 @@ class CallBottomSheetFragment(val showIncomingCallsClickListener: (Call?) -> Uni
233235
startAudioDumpListener()
234236
}
235237

238+
enableReceiverSpeechEnhancement.text = if (webexViewModel.isReceiverSpeechEnhancementEnabled()) "Receiver Speech Enhancement: ON" else "Receiver Speech Enhancement: OFF"
239+
240+
enableReceiverSpeechEnhancement.setOnClickListener {
241+
dismiss()
242+
toggleReceiverSpeechEnhancement()
243+
}
244+
236245
cancel.setOnClickListener { dismiss() }
237246
}.root
238247
}

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/calling/CallControlsFragment.kt

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -927,7 +927,7 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface,
927927
onCallJoined(call)
928928
handleCallControls(call)
929929
}
930-
WebexRepository.CallEvent.DialFailed, WebexRepository.CallEvent.WrongApiCalled, WebexRepository.CallEvent.CannotStartInstantMeeting -> {
930+
WebexRepository.CallEvent.DialFailed, WebexRepository.CallEvent.NonExistentCallPull, WebexRepository.CallEvent.WrongApiCalled, WebexRepository.CallEvent.CannotStartInstantMeeting -> {
931931
dismissErrorDialog()
932932
val callActivity = activity as CallActivity?
933933
callActivity?.alertDialog(true, errorMessage ?: event.name)
@@ -1506,7 +1506,8 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface,
15061506
{ claimHostClickListener() },
15071507
{ showBreakoutSessions() },
15081508
{ call -> showCaptionDialog(call) },
1509-
{ startAudioDump() })
1509+
{ startAudioDump() },
1510+
{ toggleReceiverSpeechEnhancement() }, webexViewModel)
15101511

15111512
multiStreamOptionsBottomSheetFragment = MultiStreamOptionsBottomSheetFragment({ call -> setCategoryAOptionClickListener(call) },
15121513
{ call -> setCategoryBOptionClickListener(call) },
@@ -1631,7 +1632,7 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface,
16311632
initAddedCallControls()
16321633
binding.ivNetworkSignal.setOnClickListener(this)
16331634
binding.ivNetworkSignal.visibility = View.GONE
1634-
binding.btnReturnToMainSession.visibility = View.INVISIBLE
1635+
binding.btnReturnToMainSession.visibility = INVISIBLE
16351636

16361637
passwordDialog = Dialog(requireContext())
16371638

@@ -1846,13 +1847,13 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface,
18461847
Log.d(TAG, "CallControlsFragment screenShareButtonVisibilityState canShare: $canShare")
18471848

18481849
if (canShare) {
1849-
binding.ibScreenShare.visibility = View.VISIBLE
1850+
binding.ibScreenShare.visibility = VISIBLE
18501851
} else {
1851-
binding.ibScreenShare.visibility = View.INVISIBLE
1852+
binding.ibScreenShare.visibility = INVISIBLE
18521853
}
18531854

18541855
} ?: run {
1855-
binding.ibScreenShare.visibility = View.INVISIBLE
1856+
binding.ibScreenShare.visibility = INVISIBLE
18561857
}
18571858
}
18581859

@@ -1861,7 +1862,7 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface,
18611862
val call = webexViewModel.getCall(callId)
18621863
call?.let {
18631864
if (it.isWebexCallingOrWebexForBroadworks() && !it.isGroupCall()) {
1864-
binding.ibDirecttransferCall.visibility = View.VISIBLE
1865+
binding.ibDirecttransferCall.visibility = VISIBLE
18651866
}
18661867
}
18671868
}
@@ -3223,6 +3224,19 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface,
32233224
webexViewModel.setRemoteVideoRenderMode(call?.getCallId().orEmpty(), webexViewModel.scalingMode)
32243225
}
32253226

3227+
private fun toggleReceiverSpeechEnhancement() {
3228+
Log.d(TAG, "toggleReceiverSpeechEnhancement")
3229+
webexViewModel.enableReceiverSpeechEnhancement(!webexViewModel.isReceiverSpeechEnhancementEnabled()) {
3230+
if (it.isSuccessful) {
3231+
Log.d(TAG, "enableReceiverSpeechEnhancementClickListener success")
3232+
Toast.makeText(activity, "Receiver Speech Enhancement ${if (webexViewModel.isReceiverSpeechEnhancementEnabled()) "Enabled" else "Disabled"}", Toast.LENGTH_LONG).show()
3233+
} else {
3234+
Log.d(TAG, "enableReceiverSpeechEnhancementClickListener failed")
3235+
Toast.makeText(activity, "Receiver Speech Enhancement failed", Toast.LENGTH_LONG).show()
3236+
}
3237+
}
3238+
}
3239+
32263240
private fun showBottomSheet(call: Call?) {
32273241
callOptionsBottomSheetFragment.call = call
32283242
callOptionsBottomSheetFragment.scalingModeValue = webexViewModel.scalingMode

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/firebase/KitchenSinkFCMService.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.os.Handler
1111
import android.os.Looper
1212
import android.text.Html
1313
import android.util.Log
14+
import android.widget.Toast
1415
import androidx.core.app.NotificationCompat
1516
import com.ciscowebex.androidsdk.CompletionHandler
1617
import com.ciscowebex.androidsdk.internal.ResultImpl
@@ -31,6 +32,7 @@ import com.ciscowebex.androidsdk.kitchensink.utils.decryptPushRESTPayload
3132
import com.ciscowebex.androidsdk.message.Message
3233
import com.ciscowebex.androidsdk.phone.Call
3334
import com.ciscowebex.androidsdk.phone.CallObserver
35+
import com.ciscowebex.androidsdk.phone.CallObserver.OtherConnected
3436
import com.ciscowebex.androidsdk.phone.NotificationCallType
3537
import com.ciscowebex.androidsdk.phone.Phone
3638
import com.ciscowebex.androidsdk.phone.PushNotificationResult
@@ -86,6 +88,12 @@ class KitchenSinkFCMService : FirebaseMessagingService() {
8688
val notificationManager =
8789
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?
8890
notificationManager?.cancel(Constants.Notification.WEBEX_CALL)
91+
when(event){
92+
is OtherConnected -> {
93+
Log.i(TAG, "The Call has been answered by other person in the hunt group")
94+
Toast.makeText(applicationContext, "The Call has been answered by other person in the hunt group", Toast.LENGTH_LONG).show()
95+
}
96+
}
8997
Handler(Looper.getMainLooper()).post {
9098
it.getCallId()?.let {callId->
9199
repository.removeCallObserver(

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/setup/SetupActivity.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@ import android.view.View
77
import android.widget.AdapterView
88
import android.widget.Toast
99
import androidx.databinding.DataBindingUtil
10+
import com.ciscowebex.androidsdk.internal.ResultImpl
1011
import com.ciscowebex.androidsdk.kitchensink.BaseActivity
1112
import com.ciscowebex.androidsdk.kitchensink.KitchenSinkForegroundService
1213
import com.ciscowebex.androidsdk.kitchensink.R
1314
import com.ciscowebex.androidsdk.kitchensink.WebexRepository
1415
import com.ciscowebex.androidsdk.kitchensink.databinding.ActivitySetupBinding
1516
import com.ciscowebex.androidsdk.kitchensink.utils.PermissionsHelper
1617
import com.ciscowebex.androidsdk.kitchensink.utils.SharedPrefUtils
18+
import com.ciscowebex.androidsdk.omniusenums.ReceivingSpeechEnhancementEnableResult
1719
import com.ciscowebex.androidsdk.phone.Phone
20+
import com.ciscowebex.androidsdk.phone.SpeechEnhancementResult
1821
import org.koin.android.ext.android.inject
1922

2023
class SetupActivity: BaseActivity() {
@@ -171,6 +174,26 @@ class SetupActivity: BaseActivity() {
171174
multiStreamApproachNewToggle.setOnCheckedChangeListener { _, checked ->
172175
webexViewModel.multistreamNewApproach = checked
173176
}
177+
178+
enableLegacyNoiseRemovalToggle.setOnCheckedChangeListener { _, checked ->
179+
webexViewModel.useLegacyReceiverNoiseRemoval(checked)
180+
webexViewModel.enableLegacyNoiseRemoval = checked
181+
}
182+
183+
enableLegacyNoiseRemovalToggle.isChecked = webexViewModel.enableLegacyNoiseRemoval
184+
185+
enableSpeechEnhancementToggle.setOnCheckedChangeListener { _, checked ->
186+
webexViewModel.enableReceiverSpeechEnhancementByDefault(checked) {
187+
if (it.isSuccessful) {
188+
Toast.makeText(this@SetupActivity, "Speech enhancement $checked", Toast.LENGTH_SHORT).show()
189+
}
190+
else {
191+
showErrorDialog(it.error?.errorMessage ?: "Failed to enable speech enhancement")
192+
}
193+
}
194+
}
195+
196+
enableSpeechEnhancementToggle.isChecked = webexViewModel.isReceiverSpeechEnhancementEnabledByDefault()
174197
}
175198
}
176199

app/src/main/res/layout/activity_setup.xml

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,62 @@
155155
</RelativeLayout>
156156

157157
<RelativeLayout
158-
android:id="@+id/callCapabilityLayout"
158+
android:id="@+id/enableLegacyNoiseRemovalLayout"
159159
android:layout_width="match_parent"
160160
android:layout_height="wrap_content"
161161
android:layout_below="@+id/multiStreamApproachNewLayout"
162162
android:layout_marginTop="16dp">
163163

164+
<TextView
165+
android:id="@+id/enableLegacyNoiseRemovalToggleText"
166+
android:layout_width="wrap_content"
167+
android:layout_height="wrap_content"
168+
android:layout_alignParentStart="true"
169+
android:layout_centerVertical="true"
170+
android:text="@string/enable_legacy_noise_removal" />
171+
172+
<ToggleButton
173+
android:id="@+id/enableLegacyNoiseRemovalToggle"
174+
android:layout_width="wrap_content"
175+
android:layout_height="wrap_content"
176+
android:layout_alignParentEnd="true"
177+
android:layout_centerVertical="true"
178+
android:checked="false" />
179+
180+
</RelativeLayout>
181+
182+
<RelativeLayout
183+
android:id="@+id/enableSpeechEnhancementLayout"
184+
android:layout_width="match_parent"
185+
android:layout_height="wrap_content"
186+
android:layout_below="@+id/enableLegacyNoiseRemovalLayout"
187+
android:layout_marginTop="16dp">
188+
189+
<TextView
190+
android:id="@+id/enableSpeechEnhancementToggleText"
191+
android:layout_width="wrap_content"
192+
android:layout_height="wrap_content"
193+
android:layout_alignParentStart="true"
194+
android:layout_centerVertical="true"
195+
android:text="@string/enable_speech_enhancement" />
196+
197+
<ToggleButton
198+
android:id="@+id/enableSpeechEnhancementToggle"
199+
android:layout_width="wrap_content"
200+
android:layout_height="wrap_content"
201+
android:layout_alignParentEnd="true"
202+
android:layout_centerVertical="true"
203+
android:checked="false" />
204+
205+
</RelativeLayout>
206+
207+
<RelativeLayout
208+
android:id="@+id/callCapabilityLayout"
209+
android:layout_width="match_parent"
210+
android:layout_height="wrap_content"
211+
android:layout_below="@+id/enableSpeechEnhancementLayout"
212+
android:layout_marginTop="16dp">
213+
164214
<TextView
165215
android:id="@+id/textViewCallCap"
166216
android:layout_width="wrap_content"

0 commit comments

Comments
 (0)