Skip to content

Migration to Unified Space Meetings

ciscoRankush edited this page Jul 8, 2024 · 8 revisions

Introduction

In Webex, meetings can be broadly classified into Webex Meetings and Space Meetings. Set of features available in each of these meeting types are different. As a result meeting experience differs.

Goal of improved meetings in a space is to provide a single meeting experience which is a superset of Webex Meeting and Space Meetings. Meeting experience would be same regardless of how the meeting is joined or where it is scheduled from. Note: This new behavior change would be applicable from 3.11.0 release onwards.

New key behavior changes in space meetings

  • Dynamic meeting ID and URL. URL includes /MTID. This makes concurrent meetings by different hosts in the same space possible.

  • Ad-hoc meeting/Instant meeting has new meeting URL everytime. Earlier in instant meeting same static URL were used all the time.

  • Earlier meeting experience and feature set was tied to meeting sponsor's entitlement. Meeting sponsor is one who created the space. With improved space meetings, concept of meeting sponsorship is removed. Meeting creator's license determines meeting capabilities.

  • For scheduled meetings, if the user is not part of the space then there is a requirement to enter the password. On entering incorrect password few times, captcha information is provided along with appropriate error code via API. Subsequently correct password and captcha information is required for user to be able to successfully join the meeting.

  • Space meetings now has advanced meeting capabilities such as real time transcriptions and closed captions.

Meeting join flow

Earlier a group space-id could be passed as an input string to create an instant meeting in the space. This is no longer supported. Error CANNOT_START_INSTANT_MEETING(-7015) will be thrown for such cases.

SDK clients can only join or start an already created meeting. webex.phone.dial API only accepts a meeting number, sip uri of the meeting or a meeting url. SDK clients can also move meetings to this device if the meeting is already joined on another device by setting CompanionMode parameter to MoveMeeting in the dial API.

eg:

webex.phone.dial("12345678901", option, CompletionHandler { result ->
    if (result.isSuccessful) {
        // Success. Do necessary handling
    } else {
        // Handle error
    }
})

webex.phone.dial("[email protected]", option, CompletionHandler { result ->
    if (result.isSuccessful) {
        // Success. Do necessary handling
    } else {
        // Handle error
    }
})

webex.phone.dial("https://cisco.webex.com/cisco/j.php?MTID=m12345fe91b1d96592e749dc331b492eddd", option, CompletionHandler { result ->
    if (result.isSuccessful) {
        // Success. Do necessary handling
    } else {
        // Handle error
    }
})

Depending on how the meeting is created, participant might have to wait in a lobby before host admits them to the meeting. This is notifed in the Call observer.

webex.phone().dial("https://cisco.webex.com/cisco/j.php?MTID=m12345fe91b1d96592e749dc331b492eddd", MediaOption.audioVideoSharing(Pair(localView,remoteView), screenShareView), CompletionHandler { result ->
    if (result.isSuccessful) {
        result.data?.let { _call ->
            // Joining a meeting is successful
            _call.setObserver(object : CallObserver {
                override fun onConnected(call: Call?) {
                }

                override fun onRinging(call: Call?) {
                }

                override fun onWaiting(call: Call?, reason: Call.WaitReason?) {
                    // Indicates self participant is Waiting in lobby and has to be letIn by host
                }

                override fun onDisconnected(event: CallObserver.CallDisconnectedEvent?) {
                }

                override fun onInfoChanged(call: Call?) {
                }

                override fun onCallMembershipChanged(event: CallObserver.CallMembershipChangedEvent?) {
                }

                override fun onScheduleChanged(call: Call?) {
                }
            })
        }
    } else {
        result.error?.let { errorCode ->
            
        }
    }
});

If SDK client is joining a meeting as a host and if another participant is waiting in the lobby, For such cases, SDK client can admit the participant using below API. CallMembership object needs to be passed of the participant who is waiting in the lobby.

    call.letIn(callMembership)

Join Meeting by Entering Password/Captcha

If the user is not part of the space where the meeting is created then the user will be prompted for password. On entering incorrect password few times, captcha information is provided along with appropriate error code in the completion result of webex.phone.dial API. Subsequently correct password and captcha information is required for user to be able to successfully join the meeting.

webex.phone.dial(input, option, CompletionHandler { result ->
    if (result.isSuccessful) {
        // Success. Do necessary handling
    } else {
        result.error?.let { error ->
            when (error.errorCode) {
                WebexError.ErrorCode.HOST_PIN_OR_MEETING_PASSWORD_REQUIRED.code -> {
                    // Prompt user for password. Use MediaOption param in dial API for providing password
                }
                WebexError.ErrorCode.INVALID_PASSWORD.code -> {
                    // Prompt user for password. Use MediaOption param in dial API for providing password
                }
                WebexError.ErrorCode.CAPTCHA_REQUIRED.code -> {
                    // Prompt user to enter password, captcha. Use MediaOption param in dial API for providing password, captcha value entered by user and captcha id. Captcha ID, Image URL, Audio URL are part of the error data which is Phone.Captcha sent with this error.
                }
                WebexError.ErrorCode.INVALID_PASSWORD_WITH_CAPTCHA.code -> {
                    // Prompt user to enter password, captcha. Use MediaOption param in dial API for providing password, captcha value entered by user and captcha id. Captcha ID, Image URL, Audio URL are part of the error data which is Phone.Captcha sent with this error.
                }
                else -> {

                }

            }
        } ?: run {

        }
    }
})

Note : Password and Captcha flow is applicable only when dialing a meeting number and sip uri. Joining using meeting link does not prompt for password.

Refresh captcha

A new API is added for refreshing the meeting captcha code if present.

webex.phone.refreshMeetingCaptcha(CompletionHandler { result ->
    result?.let {
        //result.data is of type Phone.Captcha
    }
})

Join meeting as host

If the user has the host key and wishes to join the meeting as host, below API can be used.

val option: MediaOption = MediaOption.audioOnly()
mediaOption.setModerator(true)
mediaOption.setPin(123456)

webex.phone.dial("[email protected]", option, CompletionHandler { result ->
    if (result.isSuccessful) {
        // Success. Do necessary handling
    } else {
        // Handle error
    }
})

Reclaim host role

When joining a meeting using a meeting link, password is not required. Such a participant is an attendee and not a host. If the attendee has the host key and wishes to reclaim the host role, below API can be used.

If the participant is the creator of the meeting then host pin can be empty in the reclaimHost API.

call.reclaimHost("123456", CompletionHandler { result ->
    if (result.isSuccessful) {
        // Success. Do necessary handling
    } else {
        // Handle error
    }
})

Make another participant host

A participant can be made host using below API. Only a host or co-host can make another participant host. Participant Id can be obtained from CallMembership object.

call.makeHost("participantId", CompletionHandler { result ->
   if (result.isSuccessful) {
       // Success. Do necessary handling
   } else {
       // Handle error
   }
})

Invite another participant

A participant can be invited to the meeting using below API. Only a host can invite another participant. Participant can be invited using an email address.

call.inviteParticipant("[email protected]", CompletionHandler { result ->
    if (result.isSuccessful) {
        // Success. Do necessary handling
    } else {
        // Handle error
    }
})

Move Meeting

We can also transfer the meeting to this device if the meeting is already joined on another device by setting the CompanionMode parameter in the MediaOption to MoveMeeting. The default value for the CompanionMode is None. The feature toggle "mobile-move-meeting-enabled" must be enabled for users to utilize the move meeting feature. The meeting must be on a converged site to use the move meeting feature.

val meeting = webex.calendarMeeting.getMeetingById(meetingId)
val isMoveMeetingPossible = meeting.isOngoingMeeting && webex.calendarMeeting.isMoveMeetingSupported(meeting.calendarMeeting.id)
if(isMoveMeetingPossible) {
    val option: MediaOption = MediaOption.audioOnly()
    option.setCompanionMode(CompanionMode.MoveMeeting)
    webex.phone.dial(meeting.calendarMeeting.meetingLink, option, CompletionHandler { result ->
        if (result.isSuccessful) {
            // Success. Do necessary handling
        } else {
            // Handle error
        }
    })
}

Webex assistant and more

Once you have migrated to this new meetings experience, features like real time transcription, closed captions, etc can be used. Please refer to the Real Time Transcription and Closed Captions documents for more details.

Clone this wiki locally