Skip to content

Commit 6056183

Browse files
authored
Merge pull request #37 from webex/patch/3.2.1
Patch/3.2.1
2 parents 5af47a2 + 7ab699e commit 6056183

File tree

11 files changed

+137
-64
lines changed

11 files changed

+137
-64
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ This demo support Android device with **Android 7.0** or later
6868
6969
```
7070
dependencies {
71-
implementation 'com.ciscowebex:androidsdk:3.2.0@aar'
71+
implementation 'com.ciscowebex:androidsdk:3.2.1@aar'
7272
}
7373
```
7474

app/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ android {
1919
applicationId "com.cisco.sdk_android"
2020
minSdkVersion Versions.minSdk
2121
targetSdkVersion Versions.targetSdk
22-
versionCode 32000
23-
versionName "3.2.0"
22+
versionCode 32100
23+
versionName "3.2.1"
2424

2525
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2626
buildConfigField "String", "CLIENT_ID", "${CLIENT_ID}"
@@ -62,7 +62,7 @@ android {
6262
}
6363

6464
dependencies {
65-
implementation 'com.ciscowebex:androidsdk:3.2.0@aar'
65+
implementation 'com.ciscowebex:androidsdk:3.2.1@aar'
6666

6767
implementation fileTree(dir: "libs", include: ["*.jar"])
6868
implementation Dependencies.kotlinStdLib

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.ciscowebex.androidsdk.auth.PhoneServiceRegistrationFailureReason
1212
import com.ciscowebex.androidsdk.auth.UCLoginServerConnectionStatus
1313
import com.ciscowebex.androidsdk.kitchensink.utils.CallObjectStorage
1414
import com.ciscowebex.androidsdk.calendarMeeting.CalendarMeetingObserver
15+
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.listeners.SpaceEventListener
1516
import com.ciscowebex.androidsdk.membership.Membership
1617
import com.ciscowebex.androidsdk.membership.MembershipObserver
1718
import com.ciscowebex.androidsdk.message.LocalFile
@@ -132,6 +133,7 @@ class WebexRepository(val webex: Webex) : WebexUCLoginDelegate {
132133
var _stopShareLiveData: MutableLiveData<Boolean>? = null
133134

134135
var _spaceEventLiveData: MutableLiveData<Pair<SpaceEvent, Any?>>? = null
136+
var spaceEventListener : SpaceEventListener? = null
135137
var _membershipEventLiveData: MutableLiveData<Pair<MembershipEvent, Membership?>>? = null
136138
var _messageEventLiveData: MutableLiveData<Pair<MessageEvent, Any?>>? = null
137139
var _calendarMeetingEventLiveData: MutableLiveData<Pair<CalendarMeetingEvent, Any>>? = null
@@ -160,7 +162,7 @@ class WebexRepository(val webex: Webex) : WebexUCLoginDelegate {
160162
}
161163

162164
fun clearSpaceData(){
163-
_spaceEventLiveData = null
165+
spaceEventListener = null
164166
}
165167

166168
fun setSpaceObserver() {
@@ -169,20 +171,20 @@ class WebexRepository(val webex: Webex) : WebexUCLoginDelegate {
169171
Log.d(tag, "onEvent: $event with actorID : ${event.getActorId().orEmpty()}")
170172
when (event) {
171173
is SpaceObserver.SpaceCallStarted -> {
172-
_spaceEventLiveData?.postValue(Pair(SpaceEvent.CallStarted, event.getSpaceId()))
174+
spaceEventListener?.onCallStarted(event.getSpaceId() ?: "")
173175
isSpaceCallStarted = true
174176
spaceCallId = event.getSpaceId()
175177
}
176178
is SpaceObserver.SpaceCallEnded -> {
177-
_spaceEventLiveData?.postValue(Pair(SpaceEvent.CallEnded, event.getSpaceId()))
179+
spaceEventListener?.onCallEnded(event.getSpaceId() ?: "")
178180
isSpaceCallStarted = false
179181
spaceCallId = null
180182
}
181183
is SpaceObserver.SpaceCreated -> {
182-
_spaceEventLiveData?.postValue(Pair(SpaceEvent.Created, event.getSpace()))
184+
event.getSpace()?.let { spaceEventListener?.onCreate(it) }
183185
}
184186
is SpaceObserver.SpaceUpdated -> {
185-
_spaceEventLiveData?.postValue(Pair(SpaceEvent.Updated, event.getSpace()))
187+
event.getSpace()?.let { spaceEventListener?.onUpdate(it) }
186188
}
187189
}
188190
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class WebexViewModel(val webex: Webex, val repository: WebexRepository) : BaseVi
4545
val _stopShareLiveData = MutableLiveData<Boolean>()
4646
val _setCompositeLayoutLiveData = MutableLiveData<Pair<Boolean, String>>()
4747
val _setRemoteVideoRenderModeLiveData = MutableLiveData<Pair<Boolean, String>>()
48+
val _forceSendingVideoLandscapeLiveData = MutableLiveData<Boolean>()
4849

4950
var callMembershipsLiveData: LiveData<List<CallMembership>> = _callMembershipsLiveData
5051
val muteAllLiveData: LiveData<Boolean> = _muteAllLiveData
@@ -55,6 +56,7 @@ class WebexViewModel(val webex: Webex, val repository: WebexRepository) : BaseVi
5556
val stopShareLiveData: LiveData<Boolean> = _stopShareLiveData
5657
val setCompositeLayoutLiveData: LiveData<Pair<Boolean, String>> = _setCompositeLayoutLiveData
5758
val setRemoteVideoRenderModeLiveData: LiveData<Pair<Boolean, String>> = _setRemoteVideoRenderModeLiveData
59+
val forceSendingVideoLandscapeLiveData: LiveData<Boolean> = _forceSendingVideoLandscapeLiveData
5860

5961
private val _incomingListenerLiveData = MutableLiveData<Call?>()
6062
val incomingListenerLiveData: LiveData<Call?> = _incomingListenerLiveData
@@ -78,6 +80,8 @@ class WebexViewModel(val webex: Webex, val repository: WebexRepository) : BaseVi
7880

7981
var isVideoViewsSwapped: Boolean = true
8082

83+
var isSendingVideoForceLandscape: Boolean = false
84+
8185
var callCapability: WebexRepository.CallCap
8286
get() = repository.callCapability
8387
set(value) {
@@ -705,6 +709,18 @@ class WebexViewModel(val webex: Webex, val repository: WebexRepository) : BaseVi
705709
getCall(callId)?.setVideoRenderViews(Pair(localVideoView, remoteVideoView))
706710
}
707711

712+
fun forceSendingVideoLandscape(callId: String, forceLandscape: Boolean) {
713+
getCall(callId)?.forceSendingVideoLandscape(forceLandscape, CompletionHandler { result ->
714+
if (result.isSuccessful) {
715+
Log.d(tag, "forceSendingVideoLandscape Lambda isSuccessful")
716+
_forceSendingVideoLandscapeLiveData.postValue(true)
717+
} else {
718+
Log.d(tag, "forceSendingVideoLandscape Lambda error: ${result.error?.errorMessage}")
719+
_forceSendingVideoLandscapeLiveData.postValue(false)
720+
}
721+
})
722+
}
723+
708724
fun getSharingRenderView(callId: String): View? {
709725
return getCall(callId)?.getSharingRenderView()
710726
}

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ class CallBottomSheetFragment(val receivingVideoClickListener: (Call?) -> Unit,
1717
val scalingModeClickListener: (Call?) -> Unit,
1818
val virtualBackgroundOptionsClickListener: (Call?) -> Unit,
1919
val compositeStreamLayoutClickListener: (Call?) -> Unit,
20-
val swapVideoClickListener: (Call?) -> Unit): BottomSheetDialogFragment() {
20+
val swapVideoClickListener: (Call?) -> Unit,
21+
val forceLandscapeClickListener: (Call?) -> Unit): BottomSheetDialogFragment() {
2122
companion object {
2223
val TAG = "MessageActionBottomSheetFragment"
2324
}
@@ -27,6 +28,7 @@ class CallBottomSheetFragment(val receivingVideoClickListener: (Call?) -> Unit,
2728
lateinit var scalingModeValue: Call.VideoRenderMode
2829
lateinit var compositeLayoutValue: MediaOption.CompositedVideoLayout
2930
lateinit var streamMode: Phone.VideoStreamMode
31+
var isSendingVideoForceLandscape: Boolean = false
3032

3133
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
3234
return BottomSheetCallOptionsBinding.inflate(inflater, container, false).also { binding = it }.apply {
@@ -138,6 +140,18 @@ class CallBottomSheetFragment(val receivingVideoClickListener: (Call?) -> Unit,
138140
swapVideoClickListener(call)
139141
}
140142

143+
var sendingVideoforceLandscapeText = getString(R.string.sending_video_force_landscape)
144+
sendingVideoforceLandscapeText += if (isSendingVideoForceLandscape) {
145+
" - " + getString(R.string.receiving_on)
146+
} else {
147+
" - " + getString(R.string.receiving_off)
148+
}
149+
sendingVideoforceLandscape.text = sendingVideoforceLandscapeText
150+
sendingVideoforceLandscape.setOnClickListener {
151+
dismiss()
152+
forceLandscapeClickListener(call)
153+
}
154+
141155
bgOptionsBtn.setOnClickListener {
142156
dismiss()
143157
virtualBackgroundOptionsClickListener(call)

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,12 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface
505505
}
506506
})
507507

508+
webexViewModel.forceSendingVideoLandscapeLiveData.observe(viewLifecycleOwner, Observer { result ->
509+
if (result) {
510+
webexViewModel.isSendingVideoForceLandscape = !webexViewModel.isSendingVideoForceLandscape
511+
}
512+
})
513+
508514
webexViewModel.virtualBgError.observe(viewLifecycleOwner, Observer { error ->
509515
Log.d(tag, error)
510516
requireContext().toast(error)
@@ -782,7 +788,8 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface
782788
{ call -> scalingModeClickListener(call) },
783789
{ call -> virtualBackgroundOptionsClickListener(call) },
784790
{ call -> compositeStreamLayoutClickListener(call) },
785-
{ call -> swapVideoClickListener(call) })
791+
{ call -> swapVideoClickListener(call) },
792+
{ call -> forceLandscapeClickListener(call) })
786793

787794
callingActivity = activity?.intent?.getIntExtra(Constants.Intent.CALLING_ACTIVITY_ID, 0)!!
788795
if (callingActivity == 1) {
@@ -1690,6 +1697,12 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface
16901697
}
16911698
}
16921699

1700+
private fun forceLandscapeClickListener(call: Call?) {
1701+
Log.d(TAG, "forceLandscapeClickListener isSendingVideoForceLandscape: ${webexViewModel.isSendingVideoForceLandscape}")
1702+
val value = !webexViewModel.isSendingVideoForceLandscape
1703+
webexViewModel.forceSendingVideoLandscape(webexViewModel.currentCallId.orEmpty(), value)
1704+
}
1705+
16931706
private fun compositeStreamLayoutClickListener(call: Call?) {
16941707
Log.d(TAG, "compositeStreamLayoutClickListener getCompositedLayout: ${webexViewModel.getCompositedLayout()}")
16951708

@@ -1743,6 +1756,7 @@ class CallControlsFragment : Fragment(), OnClickListener, CallObserverInterface
17431756
callOptionsBottomSheetFragment.scalingModeValue = webexViewModel.scalingMode
17441757
callOptionsBottomSheetFragment.compositeLayoutValue = webexViewModel.compositedVideoLayout
17451758
callOptionsBottomSheetFragment.streamMode = webexViewModel.streamMode
1759+
callOptionsBottomSheetFragment.isSendingVideoForceLandscape = webexViewModel.isSendingVideoForceLandscape
17461760
activity?.supportFragmentManager?.let { callOptionsBottomSheetFragment.show(it, CallBottomSheetFragment.TAG) }
17471761
}
17481762

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/messaging/spaces/SpacesFragment.kt

Lines changed: 41 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.ciscowebex.androidsdk.kitchensink.databinding.FragmentSpacesBinding
1818
import com.ciscowebex.androidsdk.kitchensink.messaging.search.MessagingSearchActivity
1919
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.adapters.SpaceReadStatusClientAdapter
2020
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.adapters.SpacesClientAdapter
21+
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.listeners.SpaceEventListener
2122
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.members.MembershipActivity
2223
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.members.membersReadStatus.MembershipReadStatusActivity
2324
import com.ciscowebex.androidsdk.kitchensink.person.PersonModel
@@ -60,55 +61,51 @@ class SpacesFragment : Fragment() {
6061
showAddSpaceDialog()
6162
}
6263

63-
spacesViewModel.getSpaceEvent()?.observe(viewLifecycleOwner, Observer {
64-
when (it.first) {
65-
WebexRepository.SpaceEvent.Updated -> {
66-
if (it.second is Space) {
67-
Log.d(TAG, "Space event ${(it.second as Space).title} is updated")
68-
val space = SpaceModel.convertToSpaceModel(it.second as Space?)
69-
val index = spacesClientAdapter.getPositionById(space.id)
70-
if (!spacesClientAdapter.spaces.isNullOrEmpty() && index != -1) {
71-
spacesClientAdapter.spaces[index] = space
72-
spacesClientAdapter.notifyDataSetChanged()
73-
}
64+
spacesViewModel.setSpaceEventListener(object : SpaceEventListener {
65+
override fun onUpdate(space: Space) {
66+
Log.d(TAG, "SpaceClientImpl(Fragment) Space event ${space.title} is updated")
67+
val spaceModel = SpaceModel.convertToSpaceModel(space)
68+
val index = spacesClientAdapter.getPositionById(spaceModel.id)
69+
if (!spacesClientAdapter.spaces.isNullOrEmpty() && index != -1) {
70+
Log.d(TAG, "SpaceClientImpl(Fragment) Updating space object in list")
71+
spacesClientAdapter.spaces[index] = spaceModel
72+
activity?.runOnUiThread {
73+
spacesClientAdapter.notifyItemChanged(index)
7474
}
7575
}
76-
WebexRepository.SpaceEvent.Created -> {
77-
if (it.second is Space) {
78-
val space = SpaceModel.convertToSpaceModel(it.second as Space?)
79-
spacesClientAdapter.spaces.add(0, space)
80-
spacesClientAdapter.notifyItemInserted(0)
81-
Log.d(TAG, "Space event ${(it.second as Space).title} is created")
82-
}
76+
}
77+
78+
override fun onCreate(space: Space) {
79+
val spaceModel = SpaceModel.convertToSpaceModel(space)
80+
spacesClientAdapter.spaces.add(0, spaceModel)
81+
Log.d(TAG, "Space event ${space.title} is created")
82+
activity?.runOnUiThread {
83+
spacesClientAdapter.notifyItemInserted(0)
8384
}
84-
WebexRepository.SpaceEvent.CallStarted -> {
85-
if (it.second is String?) {
86-
val spaceId = it.second as String?
87-
spaceId?.let {
88-
val index = spacesClientAdapter.getPositionById(it)
89-
if (!spacesClientAdapter.spaces.isNullOrEmpty() && index != -1) {
90-
val space = spacesClientAdapter.spaces[index]
91-
Log.d(TAG, "Space event ${space} is CallStarted")
92-
val inCallSpace = SpaceModel(spaceId, space.title + " " + addOnCallSuffix, space.spaceType, space.isLocked, space.lastActivity, space.created, space.teamId, space.sipAddress)
93-
spacesClientAdapter.spaces[index] = inCallSpace
94-
spacesClientAdapter.notifyItemChanged(index)
95-
}
96-
}
85+
}
86+
87+
override fun onCallStarted(spaceId: String) {
88+
val index = spacesClientAdapter.getPositionById(spaceId)
89+
if (!spacesClientAdapter.spaces.isNullOrEmpty() && index != -1) {
90+
val space = spacesClientAdapter.spaces[index]
91+
Log.d(TAG, "Space event ${space} is CallStarted")
92+
val inCallSpace = SpaceModel(spaceId, space.title + " " + addOnCallSuffix, space.spaceType, space.isLocked, space.lastActivity, space.created, space.teamId, space.sipAddress)
93+
spacesClientAdapter.spaces[index] = inCallSpace
94+
activity?.runOnUiThread {
95+
spacesClientAdapter.notifyItemChanged(index)
9796
}
9897
}
99-
WebexRepository.SpaceEvent.CallEnded -> {
100-
if (it.second is String?) {
101-
val spaceId = it.second as String?
102-
spaceId?.let {
103-
val index = spacesClientAdapter.getPositionById(it)
104-
if (!spacesClientAdapter.spaces.isNullOrEmpty() && index != -1) {
105-
val space = spacesClientAdapter.spaces[index]
106-
Log.d(TAG, "Space event ${space.title} is CallEnded")
107-
val inCallSpace = SpaceModel(spaceId, space.title.removeSuffix(addOnCallSuffix), space.spaceType, space.isLocked, space.lastActivity, space.created, space.teamId, space.sipAddress)
108-
spacesClientAdapter.spaces[index] = inCallSpace
109-
spacesClientAdapter.notifyItemChanged(index)
110-
}
111-
}
98+
}
99+
100+
override fun onCallEnded(spaceId: String) {
101+
val index = spacesClientAdapter.getPositionById(spaceId)
102+
if (!spacesClientAdapter.spaces.isNullOrEmpty() && index != -1) {
103+
val space = spacesClientAdapter.spaces[index]
104+
Log.d(TAG, "Space event ${space.title} is CallEnded")
105+
val inCallSpace = SpaceModel(spaceId, space.title.removeSuffix(addOnCallSuffix), space.spaceType, space.isLocked, space.lastActivity, space.created, space.teamId, space.sipAddress)
106+
spacesClientAdapter.spaces[index] = inCallSpace
107+
activity?.runOnUiThread {
108+
spacesClientAdapter.notifyItemChanged(index)
112109
}
113110
}
114111
}

app/src/main/java/com/ciscowebex/androidsdk/kitchensink/messaging/spaces/SpacesViewModel.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.lifecycle.LiveData
55
import androidx.lifecycle.MutableLiveData
66
import com.ciscowebex.androidsdk.kitchensink.BaseViewModel
77
import com.ciscowebex.androidsdk.kitchensink.WebexRepository
8+
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.listeners.SpaceEventListener
89
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.members.MembershipModel
910
import com.ciscowebex.androidsdk.kitchensink.messaging.spaces.members.MembershipRepository
1011
import com.ciscowebex.androidsdk.kitchensink.messaging.teams.TeamsRepository
@@ -38,14 +39,8 @@ class SpacesViewModel(private val spacesRepo: SpacesRepository,
3839
private val _deleteSpace = MutableLiveData<String>()
3940
val deleteSpace: LiveData<String> = _deleteSpace
4041

41-
private val _spaceEventLiveData = MutableLiveData<Pair<WebexRepository.SpaceEvent, Any?>>()
42-
4342
private val addOnCallSuffix = " (On Call)"
4443

45-
init {
46-
webexRepository._spaceEventLiveData = _spaceEventLiveData
47-
}
48-
4944
override fun onCleared() {
5045
webexRepository.clearSpaceData()
5146
}
@@ -65,7 +60,9 @@ class SpacesViewModel(private val spacesRepo: SpacesRepository,
6560
}) { _spaces.postValue(spaces.value)}.autoDispose()
6661
}
6762

68-
fun getSpaceEvent() = webexRepository._spaceEventLiveData
63+
fun setSpaceEventListener(listener : SpaceEventListener) {
64+
webexRepository.spaceEventListener = listener
65+
}
6966

7067
fun getSpacesList(maxSpaces: Int) {
7168
spacesRepo.fetchSpacesList(null, maxSpaces).observeOn(AndroidSchedulers.mainThread()).subscribe({ spacesList ->
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.ciscowebex.androidsdk.kitchensink.messaging.spaces.listeners
2+
3+
import com.ciscowebex.androidsdk.space.Space
4+
5+
interface SpaceEventListener {
6+
fun onUpdate(space: Space)
7+
fun onCreate(space: Space)
8+
fun onCallStarted(spaceId: String)
9+
fun onCallEnded(spaceId: String)
10+
}

0 commit comments

Comments
 (0)