Release Notes

3.2.0 - Oct 19, 2021

Added

Version 3.1.1 - Oct 18, 2021

Added

Version 3.1.0 - Sep 6, 2021

Added

Deprecated

Version 3.0.1 - Jun 16, 2021

Enhancements

Version 3.0.0 - Jun 1, 2021

Added

Enhancements

Breaking changes

"acl": {
  "paths": {
    ...,
    "/*/legs/**": {}
  }
}

Version 2.8.1 - Dec 14, 2020

Enhancements

Version 2.8.0 - Nov 19, 2020

Changed

Enhancements

Version 2.7.1 - Oct 27, 2020

Enhancements

Version 2.7.0 - Sep 24, 2020

Added

Version 2.6.5 - Aug 24, 2020

Enhancements

Version 2.6.4 - May 19, 2020

New

    //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

Version 2.6.3 - May 4, 2020

Fixed

Version 2.6.2 - April 29, 2020

Fixed

Version 2.6.1 - April 22, 2020

Added

Version 2.6.0 - April 20, 2020

Added

    NexmoClient.get().isConnected()

Fixed

Version 2.5.1 - April 20, 2020

Enhancements

Version 2.5.0 - March 25, 2020

Added

    nexmoClient = new NexmoClient.Builder().useFirstIceCandidate(true/false).build(context);

Version 2.4.0 - March 3 , 2020

Added

    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

  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

Changed

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

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.
    }
}
  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)
        }
   })
  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

    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


Version 2.1.0 - January 01, 2020

Added

    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();
        }
    }
    class MyActivity extends Activity{
        NexmoConversation myConversation;

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

            });
        }

        @Override public void onStop(){
            myConversation.clearMemberEventListeners();
        }
    }
    class MyActivity extends Activity{
        NexmoConversation myConversation;

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

            });
        }

        @Override public void onStop(){
            myConversation.clearCustomEventListeners();
        }
    }
    class MyActivity extends Activity{
        NexmoConversation myConversation;

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

            });
        }

        @Override public void onStop(){
            myConversation.clearLegStatusEventListeners();
        }
    }
    class MyActivity extends Activity{
        NexmoConversation myConversation;

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

            });
        }

        @Override public void onStop(){
            myConversation.clearDTMFEventListeners();
        }
    }
    class MyActivity extends Activity{
        NexmoConversation myConversation;

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

            });
        }

        @Override public void onStop(){
            myConversation.clearMessageEventListeners();
        }
    }
    class MyActivity extends Activity{
        NexmoConversation myConversation;

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

            });
        }

        @Override public void onStop(){
            myConversation.clearNexmoConversationListeners();
        }
    }
    class MyActivity extends Activity{
        NexmoConversation myConversation;

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

            });
        }

        @Override public void onStop(){
            myConversation.clearTypingEventListeners();
        }
    }
    NexmoConversation myConversation;
    myConversation.addMemberEventListener(new NexmoMemberEventListener{
        void onMemberInvited(@NonNull final NexmoMemberEvent event){
            //The invitee member
            event.getMember()
            //the inviter member
            event.getFromMember()
        }
    });

Fixed

    NexmoConversation myConversation;
    myConversation.addNexmoMessageEventListener(new NexmoMessageEventListener(){

        void onAttachmentEvent(@NonNull final NexmoAttachmentEvent attachmentEvent){
            //handle attachment event
        }    
    });

2.0.0 - 2019-12-22

Added

Changed

Fixed


2.0.0 - 2019-12-22

Added

    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

Fixed


1.2.0 - 2019-12-16

Added

    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


Version 1.1.0 - 2019-12-04

Changes

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

Fixed


Version 1.0.3 - 2019-11-20

Changes

    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")
    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

Version 1.0.2 - 2019-11-11

Changes

Version 1.0.1

New

    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){

                }
             })
        }
    });
    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

Fixed

Version 1.0.0 - 2019-09-05

Changed

    NexmoClient nexmoClientInstance = NexmoClientBuilder.Builder().build(context);
    NexmoConnectionListener myConnectionListener = new NexmoConnectionListener{
    void onConnectionStatusChange(ConnectionStatus status, ConnectionStatusReason reason){
      Log.i("onConnectionStatusChange","status:" + status + " reason:" + reason);
    }
  }
  nexmoClientInstance.setConnectionListener(myConnectionListener);
//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){
    }
});
NexmoCallMember someCallMember;
NexmoUser user = someCallMember.getUser();
String memberId = someCallMember.getMemberId();
NexmoCallStatus statues = someCallMember.getStatus();
NexmoChannel channel = someCallMember.getChannel();

New

//NexmoCustomEvent:NexmoEvent:
    String                  getCustomType()
    HashMap<String, Object> getData()
    NexmoMember someMember;
    NexmoMedia media = someMember.media;
    media.getEnabled();
    media.getMuted();
    media.getEarmuffed();

Fixed

Removed

Added

    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

Breaking Changes

Removed

Changed

Added

Fixed



Version 0.3.0 - June 4, 2019

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

Added

Breaking Changes

Removed

Changed

Added

Fixed


Version 0.2.67 - April 17, 2019

Added

Fixed