Release Notes

4.1.1 - May 25, 2022

Fixed

  • Fix NexmoMessage serialization
  • Fix error handling within NexmoClient.getConversation() when not a member.

4.1.0 - May 11, 2022

Added

  • Support for call:transfer within NexmoCall
  • Added NexmoLegTransferEvent containing details of previous and current conversation when a call is transferred
  • Added CallEventListener to receive NexmoLegTransferEvent with new members when a call is transferred to a new conversation.
   NexmoCallEventListener callEventListener = new NexmoCallEventListener() {
        @Override
        public void onLegTransfer(NexmoLegTransferEvent event, NexmoMember member) {
            Log.d(TAG, "Call Transferred");
        }
   };
  • Expose pushNotificationTTL at the NexmoClient.Builder() level to set registered device Push TTL
  • New public events NexmoSubmittedEvent, NexmoRejectedEvent and NexmoUndeliverableEvent for messages states.
  • New Message state listeners added to NexmoMessageEventListener interface.
   NexmoCallEventListener messageEventListener = new NexmoMessageEventListener() {
        @Override
        public void onSubmittedReceipt(@NonNull NexmoSubmittedEvent event) {
            Log.d("onSubmittedReceipt", "Got [" + event + "] from:" + event.getFromMember());
        }
        @Override
        public void onRejectedReceipt(@NonNull NexmoRejectedEvent event) {
            Log.d("onSubmittedReceipt", "Got [" + event + "] from:" + event.getFromMember());
        }
        @Override
        public void onUndeliverableReceipt(@NonNull NexmoUndeliverableEvent event) {
            Log.d("onSubmittedReceipt", "Got [" + event + "] from:" + event.getFromMember());
        }
   };

4.0.4 - Apr 14, 2022

Fixed

  • Changed timestamp default from local timezone to UTC

4.0.3 - Apr 4, 2022

Fixed

  • Added check to ensure user logged in during setup of prewarm outbound call.
  • Changed timestamp default to UTC without time zone.

4.0.2 - Mar 9, 2022

Enhancements

  • WebRTC dependency upgraded to version 84.0.22.

4.0.1 - Jan 21, 2022

Fixed

  • Added check to ensure user logged in before SDK tries to process push event.

4.0.0 - Dec 7, 2021

Added

  • NexmoConversation.sendMessage(message, listener) to send NexmoMessage to a conversation.
  • NexmoClient.uploadAttachment(attachment, listener) method to send NexmoAttachmentType.
  • NexmoMessage represents a message of EMessageEventType type to send.
  • EMessageEventType for messages of type text, image, audio, video, file, template, vcard, custom and location.
  • NexmoChannelType added channels of type sms, mms, whatsapp, viber and messenger.
  • NexmoAttachmentType to upload an attachment message to Vonage Media Service.
  • NexmoMessageEvent represents the member message status event dispatched into the NexmoMemberMessageStatusEventListener.

Enhancements

  • WebRTC dependency upgraded to version 84.0.0.

Deprecated

  • NexmoConversation.sendText(text, listener) method. Use NexmoConversation.sendMessage(message, listener) method instead.
  • NexmoConversation.sendAttachment(file, listener) method. Use NexmoClient.uploadAttachment(attachment, listener) and NexmoConversation.sendMessage(message, listener) method instead.

3.3.0 - Nov 22, 2022

Added

  • NexmoClient.Builder's restEnvironmentHostPinning and environmentHostPinning methods added to enable HTTP and web-socket SSL pinning.
  • NexmoPinningConfig.fromPublicKeys(...) method to create a public-key-based pinning configuration.
nexmoClient = new NexmoClient.Builder()
    .environmentHostPinning(NexmoPinningConfig.fromPublicKeys("publicKeyHash"))
    .build(context);
  • New ConnectionStatusReason case SSL_PINNING_ERROR when Disconnected due to invalid public key found backend connection.
connectionStateListener = NexmoConnectionListener { status, reason ->
    when(status){
          NexmoConnectionListener.ConnectionStatus.DISCONNECTED-> {
              if (reason == NexmoConnectionListener.ConnectionStatusReason.SSL_PINNING_ERROR) {
                  // Notify UI 
              }
          }
      }
}

3.2.0 - Oct 19, 2021

Added

  • NexmoClient.Builder.autoMediaReoffer(autoMediaReoffer) to allow to automatically reconnect media when network interfaces changes.
  • EMediaConnectionState enumerate.
  • NexmoMediaStatusListener to receive media connection state changed notification.
  • NexmoConversation.reconnectMedia() to trigger a media reconnection.
  • NexmoClient.reconnectCall(conversationId, legId, listener) to reconnect a call given a conversation id and a leg id.
  • NexmoClient.getUserSessions(userId, pageSize, order, listener) to fetch a paginated list of active user sessions.

Version 3.1.1 - Oct 18, 2021

Added

  • Change socket connectionListeners from HashSet to ArraySet.

Version 3.1.0 - Sep 6, 2021

Added

  • NexmoClient.inAppCall(username, listener) method to perform in-app calls.
  • NexmoClient.serverCall(callee, customData, listener) method to perform server calls, optionally specifying customData.

Deprecated

  • NexmoClient.call(callee, callType, listener) method.
  • NexmoCallHandler enumerate.

Version 3.0.1 - Jun 16, 2021

Enhancements

  • Fixed a bug on DTMF dispatch of a callback to event_url
  • Fixed a bug of not receiving typing events from Web to Android

Version 3.0.0 - Jun 1, 2021

Added

  • Added NexmoMemberSummary returned by conversation.getMembers(pageSize, order, listener) (paginated), representing a subset member information.
  • Added memberEvent.getInvitedBy() that represents the inviter name, if exists.
  • Added NexmoEventEmbeddedInfo to all events returned by event.getEmbeddedInfo() and containing the NexmoUser linked to the event.
  • Added conversation.getMember(memberId, listener) returning the member given its identifier.

Enhancements

  • Improve the javadoc documentation.
  • Improve callServer setup time by pre-warming leg.
  • Disable media after RTC hangup event.

Breaking changes

  • Removed NexmoCallMember, replaced with NexmoMember.
  • Removed callMember.getCallStatus(), moved to call.getMemberCallStatus(member).
  • Removed callMember.mute(boolean, listener) moved to member.enableMute(listener) and member.disableMute(listener).
  • Removed callMember.earmuff(boolean, listener) moved to member.enableEarmuff(listener) and member.enableEarmuff(listener).
  • Removed conversation.getAllMembers() moved to conversation.getMembers() (paginated).
  • Removed NexmoConversationListener.onMemberUpdated, replaced with NexmoMemberEventListener that provide onMemberInvited, onMemberAdded, onMemberRemoved subscribing by conversation.addMemberEventListener().
  • Renamed call.getCallMembers() to call.getAllMembers().
  • Renamed call.getMyCallMember() to call.getMyMember().
  • The legs endpoint should be included in acl paths on JWT token creation.
"acl": {
  "paths": {
    ...,
    "/*/legs/**": {}
  }
}

Version 2.8.1 - Dec 14, 2020

Enhancements

  • Fixed value inconsistency on attributes displayName and imageUrl for NexmoUser object.
  • Improved outbound call and conversation stability.

Version 2.8.0 - Nov 19, 2020

Changed

  • Renamed NexmoCallMemberStatus.CANCELED to NexmoCallMemberStatus.CANCELLED.

Enhancements

  • Notified with NexmoCallMemberStatus.CANCELLED on listener onMemberStatusUpdated(NexmoCallMemberStatus memberStatus, NexmoCallMember callMember) for call hang up.

Version 2.7.1 - Oct 27, 2020

Enhancements

  • Improved outbound call stability.

Version 2.7.0 - Sep 24, 2020

Added

  • Expose the reason NETWORK_ERROR on connection status DISCONNECTED for the listener onConnectionStatusChange(ConnectionStatus status, ConnectionStatusReason reason).

Version 2.6.5 - Aug 24, 2020

Enhancements

  • Improved SDK logs implementation and socket connection stability.

Version 2.6.4 - May 19, 2020

New

  • We have split our artifacts from this version, so custom maven repository has to be added to the project:
    //Groovy - build.gradle
    allprojects {
        repositories {
            
            maven {
                url "https://artifactory.ess-dev.com/artifactory/gradle-dev-local"
            }
        }
    }
    // Kotlin Gradle script  - build.gradle.kts
    allprojects {
        repositories {
        
            maven("https://artifactory.ess-dev.com/artifactory/gradle-dev-local")
        }
    }

Enhancements

  • Improved user-agent SDK version reporting.

Version 2.6.3 - May 4, 2020

Fixed

  • Changed visibility of Nexmo.page.isPrevPageExist() to public.

Version 2.6.2 - April 29, 2020

Fixed

  • Potential NullPointerException when processing push notifications during client login.

Version 2.6.1 - April 22, 2020

Added

  • Expose the interface NexmoDTMFEventListener to subscribe for DTMF events on NexmoConversation.

Version 2.6.0 - April 20, 2020

Added

  • Expose connection status isConnected in NexmoClient.
    NexmoClient.get().isConnected()

Fixed

  • Avoid invoking login multiple times when the user is already connected.

Version 2.5.1 - April 20, 2020

Enhancements

  • Improved single ICE candidate gathering implementation.

Version 2.5.0 - March 25, 2020

Added

  • Add useFirstIceCandidate parameters to NexmoClient.Builder
    nexmoClient = new NexmoClient.Builder().useFirstIceCandidate(true/false).build(context);

Version 2.4.0 - March 3 , 2020

Added

  • Add filter by state to getConversationsPage in NexmoClient.
    NexmoClient.get().getConversationsPage(50, NexmoPageOrderDesc, "JOINED", new NexmoRequestListener<NexmoConversationsPage>(){
        void onError(@NonNull NexmoApiError error){

        }
        void onSuccess(@Nullable NexmoConversationsPage result){
            //Get the current page conversations -Sync
            Collection<NexmoConversation> conversations = result.getData()
            //Get the next page -Async
            result.getNext(new NexmoRequestListener<NexmoConversationsPage>(){
                void onError(@NonNull NexmoApiError error){

                }
                void onSuccess(@Nullable NexmoConversationsPage result){

                }
            })

            //Get the previous page -Async
            result.getPrev(new NexmoRequestListener<NexmoConversationsPage>(){
                void onError(@NonNull NexmoApiError error){

                }
                void onSuccess(@Nullable NexmoConversationsPage result){

                }
            })
        }
    });

Version 2.3.0 - February 11, 2020

Added

  • Add updateAsDelivered and UpdateAsSeen to NexmoAttachmentEvent and NexmoTextEvent as helper method to update event locally after markAsSeen or markAsDelivered has been successful.
  NexmoTextEvent.markAsDelivered(object: NexmoRequestListener<Any>{
       override fun onSuccess(result: Any?) {
       Log.d(TAG, TAG + "onTextEvent.markAsDelivered():onSuccess with: " + result.toString())

            NexmoTextEvent.updateAsDelivered(my_member_id, Date.now())

       }
   })

Fixed

  • Fix markAsSeen and markAsDelivered for NexmoTextEvent and NexmoAttachmentEvent

Changed

  • Upgrade dependency libraries please add to your build Gradle
android {
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8.toString()
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Version 2.2.0 - January 31, 2020

Added

  • Add support for Custom Push Notifications, using processNexmoPush() ,processPushNotification() is deprecated
if (NexmoClient.isNexmoPushNotification(message!!.data)) {
    val pushListener = object : NexmoPushEventListener {
            override fun onIncomingCall(nexmoCall: NexmoCall?) {
                Log.d(TestAppMessagingService.TAG, "$TAG:TestAppMessagingService:onIncomingCall() with: $nexmoCall")
            }
            override fun onError(nexmoError: NexmoApiError?) {
                Log.d(TestAppMessagingService.TAG, "$TAG:TestAppMessagingService:onError() with: $nexmoError")
            }
            override fun onNewEvent(event: NexmoEvent?) {
                Log.d(TestAppMessagingService.TAG, "$TAG:TestAppMessagingService:onNewEvent() with: $event")
            }
        }
    NexmoPushPayload nexmoPushPayload = nexmoClient.processNexmoPush(message!!.data, pushListener)
    when(nexmoPushPayload.pushTemplate){
        Default ->
            // you can use nexmoPushPayload.eventData if needed
        Custom ->
            // got nexmo custom push. 😀
            // you should parse nexmoPushEvent.customData your backend had defined.
    }
}
  • Add markAsDelivered() method to NexmoTextEvent and NexmoAttachmentEvent
  NexmoTextEvent.markAsDelivered(object: NexmoRequestListener<Any>{
       override fun onSuccess(result: Any?) {
       Log.d(TAG, TAG + "onTextEvent.markAsDelivered():onSuccess with: " + result.toString())
       }
       override fun onError(error: NexmoApiError) {
       Log.d(TAG, TAG + "onTextEvent.markAsDelivered():onError with: " + error)
        }
   })
  • Add markAsSeen() method to NexmoTextEvent and NexmoAttachmentEvent
  NexmoAttachmentEvent.markAsSeen(object: NexmoRequestListener<Any>{
       override fun onSuccess(result: Any?) {
       Log.d(TAG, TAG + "onAttachmentEvent.markAsSeen():onSuccess with: " + result.toString())
       }
       override fun onError(error: NexmoApiError) {
       Log.d(TAG, TAG + "onAttachmentEvent.markAsSeen():onError with: " + error)
        }
   })

Version 2.1.2 - January 12, 2020

Added

  • Add annotation of PermissionRequired for function that start media: NexmoClient.call , NexmoCall.answer , NexmoConvesation.enableMedia
    class MyAcitivity MakeCallActivity extends Activity {
        @Override public void onCreate(Bundle savedInstanceState){
            //Call requires permission which may be rejected by user: 
            //code should explicitly check to see if permission is available (with 'checkPermission') 
            //or explicitly handle a potential 'SecurityException'
            NexmoClient.get().call("1234567890", NexmoCallHandler.SERVER, new NexmoRequestListener<NexmoCall>(){
                @Override 
                void onError(NexmoApiError error) {
                    Log.d("NexmoCallListener", "onError call:" + error.toString())
                }

                @Override 
                void onSuccess(NexmoCall call) {
                    Log.d("NexmoCallListener", "onSuccess call:" + cal.toString())

                }
            });
        }
    }

Removed

  • Remove require for permission PROCESS_OUTGOING_CALLS
  • Remove require for permission READ_PHONE_STATE

Version 2.1.0 - January 01, 2020

Added

  • Add clearNexmoEventsListeners method in NexmoConversation to clear all listeners
    class MyActivity extends Activity{
        NexmoConversation myConversation;

        @Override public void onStart(){
            //Add listener to events
            myConversation.addMemberEventListener(new NexmoMemberEventListener(){
                    //implement functions
                }
            });

            myConversation.addCustomEventListener(new NexmoCustomEventListener(){
                    //implement functions
            });
            //Add more listeners
        }

        @Override public void onStop(){
            //Clear all listeners
            myConversation.clearNexmoEventsListeners();
        }
    }
  • Add clearMemberEventListeners method in NexmoConversation to clear all NexmoMemberEventListener listeners
    class MyActivity extends Activity{
        NexmoConversation myConversation;

        @Override public void onStart(){
        //Add listener to NexmoMemberEvent
            myConversation.addMemberEventListener(new NexmoMemberEventListener(){

            });
        }

        @Override public void onStop(){
            myConversation.clearMemberEventListeners();
        }
    }
  • Add clearCustomEventListeners method in NexmoConversation to clear all NexmoCustomEventListener listeners
    class MyActivity extends Activity{
        NexmoConversation myConversation;

        @Override public void onStart(){
        //Add listener to NexmoCustomEvent
            myConversation.addCustomEventListener(new NexmoCustomEventListener(){

            });
        }

        @Override public void onStop(){
            myConversation.clearCustomEventListeners();
        }
    }
  • Add clearLegStatusEventListeners method in NexmoConversation to clear all NexmoLegStatusEventListener listeners
    class MyActivity extends Activity{
        NexmoConversation myConversation;

        @Override public void onStart(){
        //Add listener to NexmoLegStatusEvent
            myConversation.addLegStatusEventListener(new NexmoLegStatusEventListener(){

            });
        }

        @Override public void onStop(){
            myConversation.clearLegStatusEventListeners();
        }
    }
  • Add clearDTMFEventListeners method in NexmoConversation to clear all NexmoDTMFEventListener listeners
    class MyActivity extends Activity{
        NexmoConversation myConversation;

        @Override public void onStart(){
        //Add listener to NexmoDTMFEvent
            myConversation.addDTMFEventListener(new NexmoDTMFEventListener(){

            });
        }

        @Override public void onStop(){
            myConversation.clearDTMFEventListeners();
        }
    }
  • Add clearMessageEventListeners method in NexmoConversation to clear all NexmoMessageEventListener listeners
    class MyActivity extends Activity{
        NexmoConversation myConversation;

        @Override public void onStart(){
        //Add listener to NexmoMessageEvent
            myConversation.addMessageEventListener(new NexmoMessageEventListener(){

            });
        }

        @Override public void onStop(){
            myConversation.clearMessageEventListeners();
        }
    }
  • Add clearNexmoConversationListeners method in NexmoConversation to clear all NexmoConversationListener listeners
    class MyActivity extends Activity{
        NexmoConversation myConversation;

        @Override public void onStart(){
        //Add listener to NexmoConversation
            myConversation.addNexmoConversationListener(new NexmoConversationListener(){

            });
        }

        @Override public void onStop(){
            myConversation.clearNexmoConversationListeners();
        }
    }
  • Add clearTypingEventListeners method in NexmoConversation to clear all NexmoTypingEventListener listeners
    class MyActivity extends Activity{
        NexmoConversation myConversation;

        @Override public void onStart(){
        //Add listener to NexmoTypingEvent
            myConversation.addTypingEventListener(new NexmoTypingEventListener(){

            });
        }

        @Override public void onStop(){
            myConversation.clearTypingEventListeners();
        }
    }
  • Add NexmoMember parameter to NexmoMemberEvent with respect to the NexmoMember acted on by:
    NexmoConversation myConversation;
    myConversation.addMemberEventListener(new NexmoMemberEventListener{
        void onMemberInvited(@NonNull final NexmoMemberEvent event){
            //The invitee member
            event.getMember()
            //the inviter member
            event.getFromMember()
        }
    });

Fixed

  • dispatch NexmoAttachmentEvent with respect to NexmoConversation
    NexmoConversation myConversation;
    myConversation.addNexmoMessageEventListener(new NexmoMessageEventListener(){

        void onAttachmentEvent(@NonNull final NexmoAttachmentEvent attachmentEvent){
            //handle attachment event
        }    
    });
  • dispatch NexmoMediaEvent with respect to NexmoConveration
  • dispatch NexmoMediaActionEvent with respect to NexmoConveration
  • make NexmoDTMFEvent inheritance NexmoEvent
  • NexmoTextEvent.equals to use super.equals
  • NexmoConversation.getCreationDate to return Date java object
  • NexmoEvent.getCreationDate fix IllegalArgumentException

2.0.0 - 2019-12-22

Added

  • Add filter by EventType in NexmoConversation.getEvents ```java NexmoConversation myConversation //Get all text event for a specifc conversation myConversation.getEvents(10, NexmoPageOrderDesc, "text", new NexmoRequestListener { void onError(@NonNull NexmoApiError error){ }

    void onSuccess(@Nullable NexmoEventsPage result){ Collection textEvents = result.getData() } }); //Get all member event for a specifc conversation myConversation.getEvents(10, NexmoPageOrderDesc, "member:*", new NexmoRequestListener { void onError(@NonNull NexmoApiError error){ }

    void onSuccess(@Nullable NexmoEventsPage result){ Collection memberEvents = result.getData() } }); ```

Changed

  • NexmoDeliveredEvent remove InitialEvent parameter and add InitialEventId
  • NexmoSeenEvent remove InitialEvent parameter and add InitialEventId

Fixed

  • Support for DTLS in WebRTC
  • NexmoConversationsPage.getPrev() return the conversations from the right cursor

2.0.0 - 2019-12-22

Added

  • Add filter by EventType in NexmoConversation.getEvents
    NexmoConversation myConversation
    //Get all text event for a specifc conversation
    myConversation.getEvents(10, NexmoPageOrderDesc, "text", new NexmoRequestListener<NexmoEventsPage> {
        void onError(@NonNull NexmoApiError error){
        }

        void onSuccess(@Nullable NexmoEventsPage result){
            Collection<NexmoEvent> textEvents =  result.getData()
        }
    });
    //Get all member event for a specifc conversation
    myConversation.getEvents(10, NexmoPageOrderDesc, "member:*", new NexmoRequestListener<NexmoEventsPage> {
        void onError(@NonNull NexmoApiError error){
        }

        void onSuccess(@Nullable NexmoEventsPage result){
            Collection<NexmoEvent> memberEvents =  result.getData()
        }
    });

Changed

  • NexmoDeliveredEvent remove InitialEvent parameter and add InitialEventId
  • NexmoSeenEvent remove InitialEvent parameter and add InitialEventId

Fixed

  • Support for DTLS in WebRTC
  • NexmoConversationsPage.getPrev() return the conversations from the right cursor

1.2.0 - 2019-12-16

Added

  • Add filter by EventType in NexmoConversation.getEvents
    NexmoConversation myConversation
    //Get all text event for a specifc conversation
    myConversation.getEvents(10, NexmoPageOrderDesc, "text", new NexmoRequestListener<NexmoEventsPage> {
        void onError(@NonNull NexmoApiError error){
        }

        void onSuccess(@Nullable NexmoEventsPage result){
            Collection<NexmoEvent> textEvents =  result.getData()
        }
    });
    //Get all member event for a specifc conversation
    myConversation.getEvents(10, NexmoPageOrderDesc, "member:*", new NexmoRequestListener<NexmoEventsPage> {
        void onError(@NonNull NexmoApiError error){
        }

        void onSuccess(@Nullable NexmoEventsPage result){
            Collection<NexmoEvent> memberEvents =  result.getData()
        }
    });

Fixed

  • Support for DTLS in WebRTC

Version 1.1.0 - 2019-12-04

Changes

  • Add iceServerUrls parameters to NexmoClient.Builder
    nexmoClient = new NexmoClient.Builder().iceServerUrls(new String[]{"stun/turn servr url"}).build(context);

Fixed

  • fix Push Notification incoming call issue

Version 1.0.3 - 2019-11-20

Changes

  • change signature of NexmoClient.login(), remove NexmoRequestListener<NexmoUser> parameter:
    nexmoClient = new NexmoClient.Builder().build(context);
    nexmoClient.setConnectionListener(new NexmoConnectionListener() {
          @Override
          public void onConnectionStatusChange(ConnectionStatus connectionStatus, ConnectionStatusReason connectionStatusReason) {
              switch (connectionStatus){
                case CONNECTED:
                    //the client is connected to the server - the login successed 
                case DISCONNECTED:
                case CONNECTING:
                case UNKNOWN:
                    //the client is not connected to the server - the login failed/not yet successed 
            } 
          });
    NexmoClient.login("MY_AUTH_TOKEN")
  • change signature of NexmoPushEventListener.onIncomingCall(), remove MemberEvent parameter:
    override public void onMessageReceived(@Nullable RemoteMessage message) {
    if (NexmoClient.isNexmoPushNotification(message.getData())) {
                handleNexmoPushForLoggedInUser(message)
            } 
    }
    nexmoClient.processPushNotification(message.getData(), new NexmoPushEventListener(){
        public void onIncomingCall(NexmoCall nexmoCall){
        }
        public void onNewEvent(NexmoEvent event){
        }
        public void onError(NexmoApiError error){
        }
    })

Fixed

  • fix NexmoConversation.sendAttachment bug
  • fix NexmoAttachmentEvent received from backend
  • fix race condition bug cause drop calls
  • fix bug in push notification

Version 1.0.2 - 2019-11-11

Changes

  • Rename GetConversationsPage to GetConversations
  • Rename GetEventsPage to GetEvents
  • NexmoClient.GetConversations default pageSize is 10
  • NexmoConversation.GetEvents default pageSize is 10

Version 1.0.1

New

  • Add getConversationsPage in NexmoClient
    NexmoClient.get().getConversationsPage(50, NexmoPageOrderDesc, new NexmoRequestListener<NexmoConversationsPage>(){
        void onError(@NonNull NexmoApiError error){

        }
        void onSuccess(@Nullable NexmoConversationsPage result){
             //Get the current page conversations -Sync
             Collection<NexmoConversation> conversations = result.getData()
             //Get the next page -Async
             result.getNext(new NexmoRequestListener<NexmoConversationsPage>(){
             void onError(@NonNull NexmoApiError error){

                }
                void onSuccess(@Nullable NexmoConversationsPage result){

                }
             })

             //Get the previous page -Async
             result.getPrev(new NexmoRequestListener<NexmoConversationsPage>(){
             void onError(@NonNull NexmoApiError error){

                }
                void onSuccess(@Nullable NexmoConversationsPage result){

                }
             })
        }
    });
  • Add getEventsPage in NexmoConversation
    NexmoConversation myConversation;
    ...
    myConversation.getEventsPage(50, NexmoPageOrderDesc, new NexmoRequestListener<NexmoEventsPage>(){
        void onError(@NonNull NexmoApiError error){

        }
        void onSuccess(@Nullable NexmoEventsPage result){
            //Current event page data -Sync
            Collection<NexmoEvent> events = result.getData();
            //Get the next page -Async
            result.getNext( new NexmoRequestListener<NexmoEventsPage>(){
                 void onError(@NonNull NexmoApiError error){

                        }
                void onSuccess(@Nullable NexmoEventsPage result){
                }
            }
            );

            //Get the previous page -Async
            result.getPrev( new NexmoRequestListener<NexmoEventsPage>(){
                 void onError(@NonNull NexmoApiError error){

                        }
                void onSuccess(@Nullable NexmoEventsPage result){
                }
            }
            );
        }
    );

Removed

  • remove conversation.getEvents()

Fixed

  • NexmoConversation Parcelable fixed

Version 1.0.0 - 2019-09-05

Changed

  • NexmoClient is a singleton and get only the Context as a mandatory parameter. To initialize NexmoClient:
    NexmoClient nexmoClientInstance = NexmoClientBuilder.Builder().build(context);
  • In order to set NexmoConnectionListener:
    NexmoConnectionListener myConnectionListener = new NexmoConnectionListener{
    void onConnectionStatusChange(ConnectionStatus status, ConnectionStatusReason reason){
      Log.i("onConnectionStatusChange","status:" + status + " reason:" + reason);
    }
  }
  nexmoClientInstance.setConnectionListener(myConnectionListener);
  • NexmoClient call function receives a single username or phone number:
//IN APP CALL:
NexmoClient.get().call(callee, NexmoCallHandler.IN_APP, new NexmoRequestListener<NexmoCall>() {
    void onError(@NonNull NexmoApiError error){
    }
    void onSuccess(@Nullable NexmoCall result){
    }
});

//SERVER CALL:
NexmoClient.call(callee, NexmoCallHandler.SERVER, new NexmoRequestListener<NexmoCall>() {
    void onError(@NonNull NexmoApiError error){
    }
    void onSuccess(@Nullable NexmoCall result){
    }
});
  • Removed NexmoCallMember.getMember(), and added getters:
NexmoCallMember someCallMember;
NexmoUser user = someCallMember.getUser();
String memberId = someCallMember.getMemberId();
NexmoCallStatus statues = someCallMember.getStatus();
NexmoChannel channel = someCallMember.getChannel();

New

  • Android minSDK is now 23.
  • CustomEvents support in NexmoConversation:
//NexmoCustomEvent:NexmoEvent:
    String                  getCustomType()
    HashMap<String, Object> getData()
  • NexmoMedia added to NexmoConversation, for audio features support within a NexmoConversation context:
    NexmoMember someMember;
    NexmoMedia media = someMember.media;
    media.getEnabled();
    media.getMuted();
    media.getEarmuffed();
  • getNemxoEventType() in NexmoEvent is public

Fixed

  • NexmoCallMember.status reflects the current leg status.
  • Added guard to NexmoClient function to prevent calls while user is not connected.
  • Updated NexmoUser missing values after login.

Removed

  • Removed conversation.getUser(). The current user can be accessed with: NexmoClient.getUser().

Added

  • NexmoConversation send and receive CustomEvents
  • NexmoCustomEvent:NexmoEvent: String getCustomType() HashMap<String, Object> getData()
  • NexmoChannel Object to NexmoMember.
    NexmoMember someMember;
    NexmoChannel channel = someMember.channel;

Version 0.3.0 - June 4, 2019

This version contains many small bug fixes and stability improvements. The major changes are:

Added

  • NexmoChannel was added to NexmoMember, to exposes the Channel data when exists. The NexmoChannel object includes to and from fields with the data of the Channel destination and origin.

Breaking Changes

Removed

  • NexmoMember.ChannelType - should be replaced with NexmoMember.Channel.from.type

  • NexmoMember.ChannelData - should be replaced with NexmoMember.Channel.from.data

Changed

  • NexmoLoginListener was improved and updated its interface:

  • onLoginStateChange() and onAvailabilityChange() were removed

  • onConnectionStatusChange(ConnectionStatus status, ConnectionStatusReason reason) was added, as an aggregated and improved version of the above methods

Added

  • Support for parsing the MemberId who initiated a call.

Fixed

  • Improvements for cross platform in app calls

  • Crash on processing push notifications without SDK initialization

  • Crash on sending markAsDelivered event



Version 0.3.0 - June 4, 2019

This version contains many small bug fixes and stability improvements. The major changes are:

Added

  • NexmoChannel was added to NexmoMember, to exposes the Channel data when exists. The NexmoChannel object includes to and from fields with the data of the Channel destination and origin.

Breaking Changes

Removed

  • NexmoMember.ChannelType - should be replaced with NexmoMember.Channel.from.type

  • NexmoMember.ChannelData - should be replaced with NexmoMember.Channel.from.data

Changed

  • NexmoLoginListener was improved and updated its interface:

  • onLoginStateChange() and onAvailabilityChange() were removed

  • onConnectionStatusChange(ConnectionStatus status, ConnectionStatusReason reason) was added, as an aggregated and improved version of the above methods

Added

  • Support for parsing the MemberId who initiated a call.

Fixed

  • Improvements for cross platform in app calls

  • Crash on processing push notifications without SDK initialization

  • Crash on sending markAsDelivered event


Version 0.2.67 - April 17, 2019

Added

Fixed

  • Bugs on updating CallMember statuses