Java

Place a call

At the top of the class, add a new property for the callListener:

...
private Button endCallButton;
private NexmoCallEventListener callListener;

Then in the onCreate function, add the call listener:

callListener = new NexmoCallEventListener() {
    @Override
    public void onMemberStatusUpdated(NexmoCallMemberStatus callStatus, NexmoMember NexmoMember) {
        if (callStatus == NexmoCallMemberStatus.COMPLETED || callStatus == NexmoCallMemberStatus.CANCELLED) {
            onGoingCall = null;

            runOnUiThread(() -> {
                hideUI();
                waitingForIncomingCallTextView.setVisibility(View.VISIBLE);
                startCallButton.setVisibility(View.VISIBLE);
            });
        }
    }

    @Override
    public void onMuteChanged(NexmoMediaActionState newState, NexmoMember member) {}
    @Override
    public void onEarmuffChanged(NexmoMediaActionState newState, NexmoMember member) {}
    @Override
    public void onDTMF(String dtmf, NexmoMember member) {}
};

The call listener will update you on changes in the call. The above listener will reset the app to its original state when the call is ended or rejected. Add the start call click listener code in onCreate too:

startCallButton.setOnClickListener(v -> startCall());

To start the call after pressing start call button add the startCall method inside Mainctivity class:

@SuppressLint("MissingPermission")
  private void startCall() {
      client.serverCall(otherUser, null, new NexmoRequestListener<NexmoCall>() {
          @Override
          public void onError(@NonNull NexmoApiError nexmoApiError) {

          }

          @Override
          public void onSuccess(@Nullable NexmoCall call) {
            runOnUiThread(() -> {
              hideUI();
              endCallButton.setVisibility(View.VISIBLE);
              waitingForIncomingCallTextView.setVisibility(View.INVISIBLE);
            });

            onGoingCall = call;

            onGoingCall.addCallEventListener(callListener);
          }
      });
  }

The above method starts the call. When the call is started (onSuccess callback) then addCallEventListener listener is added to a call instance. This way app can be notified about call status e.g. call end.

Webhooks

As you proceed with placing the call, please switch to the terminal and notice the /voice/answer endpoint being called to retrieve the NCCO:

NCCO request:
  - callee: 447700900000

Also, as the call progresses through various stages, /voice/event is being sent events:

...
---
VOICE EVENT:
{
  from: null,
  to: 'Alice',
  uuid: '2da93da3-bcac-47ee-b48e-4a18fae7db08',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'started',
  direction: 'inbound',
  timestamp: '2021-03-10T10:36:21.285Z'
}
---
VOICE EVENT:
{
  headers: {},
  from: 'Alice',
  to: '447700900000',
  uuid: '8aa86e22-8d45-4201-b8d8-3dcd76e76429',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'started',
  direction: 'outbound',
  timestamp: '2021-03-10T10:36:27.080Z'
}
---
...
---
VOICE EVENT:
{
  start_time: null,
  headers: {},
  rate: null,
  from: 'Alice',
  to: '447700900000',
  uuid: '8aa86e22-8d45-4201-b8d8-3dcd76e76429',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'answered',
  direction: 'outbound',
  network: null,
  timestamp: '2021-03-10T10:36:31.604Z'
}
---
VOICE EVENT:
{
  headers: {},
  end_time: '2021-03-10T10:36:36.000Z',
  uuid: '8aa86e22-8d45-4201-b8d8-3dcd76e76429',
  network: '23433',
  duration: '5',
  start_time: '2021-03-10T10:36:31.000Z',
  rate: '0.10000000',
  price: '0.00833333',
  from: 'Unknown',
  to: '447700900000',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'completed',
  direction: 'outbound',
  timestamp: '2021-03-10T10:36:35.585Z'
}
---
VOICE EVENT:
{
  headers: {},
  end_time: '2021-03-10T10:36:35.000Z',
  uuid: '2da93da3-bcac-47ee-b48e-4a18fae7db08',
  network: null,
  duration: '15',
  start_time: '2021-03-10T10:36:20.000Z',
  rate: '0.00',
  price: '0',
  from: null,
  to: 'Alice',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'completed',
  direction: 'inbound',
  timestamp: '2021-03-10T10:36:36.187Z'
}

NOTE: As the call is completed, events will also contain duration and pricing information.

The end call button was shown to reflect the current state of the call:

End call
End call