Add Audio Only to Android client

Rename params hasVideo to audioOnly to match daemon API
Remove unused params for stopRecordedFilePlayback to match daemon API

Change-Id: I402402f95bffb694424e17b564ef0c8ac56cf634
diff --git a/ring-android/app/src/main/java/cx/ring/client/CallActivity.java b/ring-android/app/src/main/java/cx/ring/client/CallActivity.java
index 2c8d551..f6c743f 100644
--- a/ring-android/app/src/main/java/cx/ring/client/CallActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/CallActivity.java
@@ -27,7 +27,6 @@
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.support.v7.app.AppCompatActivity;
-import android.util.Log;
 import android.view.View;
 
 import cx.ring.BuildConfig;
@@ -38,7 +37,6 @@
 
 public class CallActivity extends AppCompatActivity {
     public static final String ACTION_CALL = BuildConfig.APPLICATION_ID + ".action.call";
-    public static final String KEY_CALL_VIDEO = "CALL_VIDEO";
 
     /* result code sent in case of call failure */
     public static int RESULT_FAILURE = -10;
@@ -70,7 +68,7 @@
         String action = getIntent().getAction();
         if (Intent.ACTION_CALL.equals(action) || ACTION_CALL.equals(action)) {
 
-            boolean hasVideo = getIntent().getBooleanExtra(KEY_CALL_VIDEO, false);
+            boolean audioOnly = getIntent().getBooleanExtra(CallFragment.KEY_AUDIO_ONLY, true);
             String accountId = getIntent().getStringExtra(ConversationFragment.KEY_ACCOUNT_ID);
             String contactRingId = getIntent().getStringExtra(ConversationFragment.KEY_CONTACT_RING_ID);
 
@@ -80,7 +78,7 @@
             CallFragment callFragment = CallFragment.newInstance(CallFragment.ACTION_PLACE_CALL,
                     accountId,
                     contactRingId,
-                    hasVideo);
+                    audioOnly);
             fragmentTransaction.replace(R.id.main_call_layout, callFragment).commit();
 
         } else if (Intent.ACTION_VIEW.equals(action)) {
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
index 92cc77e..df0296f 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
@@ -64,7 +64,6 @@
 import cx.ring.services.HardwareServiceImpl;
 import cx.ring.utils.ActionHelper;
 import cx.ring.utils.CircleTransform;
-import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.KeyboardVisibilityManager;
 
 public class CallFragment extends BaseFragment<CallPresenter> implements CallView {
@@ -78,7 +77,7 @@
     public static final String KEY_ACCOUNT_ID = "accountId";
     public static final String KEY_CONF_ID = "confId";
     public static final String KEY_NUMBER = "number";
-    public static final String KEY_HAS_VIDEO = "hasVideo";
+    public static final String KEY_AUDIO_ONLY = "AUDIO_ONLY";
 
     @BindView(R.id.contact_bubble_layout)
     protected View contactBubbleLayout;
@@ -125,12 +124,12 @@
     private PowerManager.WakeLock mScreenWakeLock;
     private DisplayManager.DisplayListener displayListener;
 
-    public static CallFragment newInstance(@NonNull String action, @Nullable String accountID, @Nullable String contactRingId, boolean hasVideo) {
+    public static CallFragment newInstance(@NonNull String action, @Nullable String accountID, @Nullable String contactRingId, boolean audioOnly) {
         Bundle bundle = new Bundle();
         bundle.putString(KEY_ACTION, action);
         bundle.putString(KEY_ACCOUNT_ID, accountID);
         bundle.putString(ConversationFragment.KEY_CONTACT_RING_ID, contactRingId);
-        bundle.putBoolean(KEY_HAS_VIDEO, hasVideo);
+        bundle.putBoolean(KEY_AUDIO_ONLY, audioOnly);
         CallFragment countDownFragment = new CallFragment();
         countDownFragment.setArguments(bundle);
         return countDownFragment;
@@ -181,7 +180,7 @@
         if (action.equals(ACTION_PLACE_CALL)) {
             presenter.initOutGoing(getArguments().getString(KEY_ACCOUNT_ID),
                     getArguments().getString(ConversationFragment.KEY_CONTACT_RING_ID),
-                    getArguments().getBoolean(KEY_HAS_VIDEO));
+                    getArguments().getBoolean(KEY_AUDIO_ONLY));
         } else if (action.equals(ACTION_GET_CALL)) {
             presenter.initIncoming(getArguments().getString(KEY_CONF_ID));
         }
@@ -495,7 +494,7 @@
     }
 
     @Override
-    public void initNormalStateDisplay(final boolean hasVideo) {
+    public void initNormalStateDisplay(final boolean audioOnly) {
         getActivity().runOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -503,7 +502,7 @@
                 refuseButton.setVisibility(View.GONE);
                 hangupButton.setVisibility(View.VISIBLE);
 
-                contactBubbleLayout.setVisibility(hasVideo ? View.INVISIBLE : View.VISIBLE);
+                contactBubbleLayout.setVisibility(audioOnly ? View.VISIBLE : View.INVISIBLE);
 
                 getActivity().invalidateOptionsMenu();
             }
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
index 4fdf9f6..ea178ff 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
@@ -277,10 +277,10 @@
                 startActivity(new Intent(getActivity(), HomeActivity.class));
                 return true;
             case R.id.conv_action_audiocall:
-                presenter.callWithVideo(false);
+                presenter.callWithAudioOnly(true);
                 return true;
             case R.id.conv_action_videocall:
-                presenter.callWithVideo(true);
+                presenter.callWithAudioOnly(false);
                 return true;
             case R.id.menuitem_addcontact:
                 presenter.addContact();
@@ -470,11 +470,11 @@
     }
 
     @Override
-    public void goToCallActivityWithResult(String accountId, String contactRingId, boolean hasVideo) {
+    public void goToCallActivityWithResult(String accountId, String contactRingId, boolean audioOnly) {
         Intent intent = new Intent(CallActivity.ACTION_CALL)
                 .setClass(getActivity().getApplicationContext(), CallActivity.class)
                 .putExtra(KEY_ACCOUNT_ID, accountId)
-                .putExtra(CallActivity.KEY_CALL_VIDEO, hasVideo)
+                .putExtra(CallFragment.KEY_AUDIO_ONLY, audioOnly)
                 .putExtra(KEY_CONTACT_RING_ID, contactRingId);
         startActivityForResult(intent, HomeActivity.REQUEST_CODE_CALL);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
index 3d4cd82..e256d1e 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
@@ -530,7 +530,7 @@
     public void goToCallActivity(String accountId, String contactId) {
         Intent intent = new Intent(CallActivity.ACTION_CALL)
                 .setClass(getActivity(), CallActivity.class)
-                .putExtra(CallActivity.KEY_CALL_VIDEO, true)
+                .putExtra(CallFragment.KEY_AUDIO_ONLY, false)
                 .putExtra(ConversationFragment.KEY_ACCOUNT_ID, accountId)
                 .putExtra(ConversationFragment.KEY_CONTACT_RING_ID, contactId);
         startActivityForResult(intent, HomeActivity.REQUEST_CODE_CALL);
diff --git a/ring-android/app/src/main/java/cx/ring/service/DRingService.java b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
index 64e5312..d4c10d3 100644
--- a/ring-android/app/src/main/java/cx/ring/service/DRingService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
@@ -337,7 +337,7 @@
 
         @Override
         public void stopRecordedFilePlayback(final String filepath) throws RemoteException {
-            mCallService.stopRecordedFilePlayback(filepath);
+            mCallService.stopRecordedFilePlayback();
         }
 
         @Override
diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java
index 70f76a5..d0a8f6e 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java
@@ -31,7 +31,6 @@
 
 public class TVCallActivity extends Activity {
 
-    public static final String SHARED_ELEMENT_NAME = "shared_element";
     static final String TAG = TVCallActivity.class.getSimpleName();
 
     @Override
@@ -45,7 +44,7 @@
         android.net.Uri u = getIntent().getData();
 
         Log.d(TAG, "u >> " + u);
-        boolean hasVideo = true;
+        boolean audioOnly = false;
         String accountId = getIntent().getStringExtra("account");
         String ringId = getIntent().getStringExtra("ringId");
 
@@ -58,7 +57,7 @@
             TVCallFragment callFragment = TVCallFragment.newInstance(TVCallFragment.ACTION_PLACE_CALL,
                     accountId,
                     ringId,
-                    hasVideo);
+                    audioOnly);
             fragmentTransaction.replace(R.id.main_call_layout, callFragment).commit();
         } else {
             Log.d(TAG, "incoming call");
diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
index 25b4afc..3ccf0c0 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
@@ -66,7 +66,7 @@
     public static final String KEY_ACCOUNT_ID = "accountId";
     public static final String KEY_CONF_ID = "confId";
     public static final String KEY_CONTACT_RING_ID = "CONTACT_RING_ID";
-    public static final String KEY_HAS_VIDEO = "hasVideo";
+    public static final String KEY_AUDIO_ONLY = "AUDIO_ONLY";
 
     @BindView(R.id.contact_bubble_layout)
     protected View contactBubbleLayout;
@@ -107,12 +107,12 @@
     // Screen wake lock for incoming call
     private PowerManager.WakeLock mScreenWakeLock;
 
-    public static TVCallFragment newInstance(@NonNull String action, @Nullable String accountID, @Nullable String contactRingId, boolean hasVideo) {
+    public static TVCallFragment newInstance(@NonNull String action, @Nullable String accountID, @Nullable String contactRingId, boolean audioOnly) {
         Bundle bundle = new Bundle();
         bundle.putString(KEY_ACTION, action);
         bundle.putString(KEY_ACCOUNT_ID, accountID);
         bundle.putSerializable(KEY_CONTACT_RING_ID, contactRingId);
-        bundle.putBoolean(KEY_HAS_VIDEO, hasVideo);
+        bundle.putBoolean(KEY_AUDIO_ONLY, audioOnly);
         TVCallFragment countDownFragment = new TVCallFragment();
         countDownFragment.setArguments(bundle);
         return countDownFragment;
@@ -163,7 +163,7 @@
         if (action.equals(ACTION_PLACE_CALL)) {
             presenter.initOutGoing(getArguments().getString(KEY_ACCOUNT_ID),
                     getArguments().getString(KEY_CONTACT_RING_ID),
-                    getArguments().getBoolean(KEY_HAS_VIDEO));
+                    getArguments().getBoolean(KEY_AUDIO_ONLY));
         } else if (action.equals(ACTION_GET_CALL)) {
             presenter.initIncoming(getArguments().getString(KEY_CONF_ID));
         }
@@ -374,7 +374,7 @@
     }
 
     @Override
-    public void initNormalStateDisplay(final boolean hasVideo) {
+    public void initNormalStateDisplay(final boolean audioOnly) {
         getActivity().runOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -382,7 +382,7 @@
                 refuseButton.setVisibility(View.GONE);
                 hangupButton.setVisibility(View.VISIBLE);
 
-                contactBubbleLayout.setVisibility(hasVideo ? View.INVISIBLE : View.VISIBLE);
+                contactBubbleLayout.setVisibility(audioOnly ? View.INVISIBLE : View.VISIBLE);
 
                 getActivity().invalidateOptionsMenu();
             }
diff --git a/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
index 749cc50..d8b66fc 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
@@ -33,7 +33,6 @@
 import cx.ring.services.AccountService;
 import cx.ring.services.CallService;
 import cx.ring.services.ContactService;
-import cx.ring.services.DeviceRuntimeService;
 import cx.ring.services.HardwareService;
 import cx.ring.services.HistoryService;
 import cx.ring.services.NotificationService;
@@ -55,7 +54,7 @@
 
     private SipCall mSipCall;
     private boolean mOnGoingCall = false;
-    private boolean mHasVideo = false;
+    private boolean mAudioOnly = true;
 
     private int videoWidth = -1;
     private int videoHeight = -1;
@@ -91,7 +90,7 @@
         mCallService.removeObserver(this);
         mHardwareService.removeObserver(this);
 
-        if (mHasVideo) {
+        if (!mAudioOnly) {
             mHardwareService.stopCapture();
         }
     }
@@ -104,13 +103,13 @@
         mHardwareService.addObserver(this);
     }
 
-    public void initOutGoing(String accountId, String contactRingId, boolean hasVideo) {
-        mSipCall = mCallService.placeCall(accountId, StringUtils.toNumber(contactRingId), hasVideo);
+    public void initOutGoing(String accountId, String contactRingId, boolean audioOnly) {
+        mAudioOnly = audioOnly;
+        mSipCall = mCallService.placeCall(accountId, StringUtils.toNumber(contactRingId), audioOnly);
         if (mSipCall == null) {
             finish();
             return;
         }
-        mHasVideo = hasVideo;
         confUpdate();
         getContactDetails();
         getView().blockScreenRotation();
@@ -123,7 +122,7 @@
             finish();
             return;
         }
-        mHasVideo = true;
+        mAudioOnly = mSipCall.isAudioOnly();
         confUpdate();
         getContactDetails();
         getView().blockScreenRotation();
@@ -133,7 +132,7 @@
         boolean isSpeakerOn = mHardwareService.isSpeakerPhoneOn();
         boolean hasContact = mSipCall != null && null != mSipCall.getContact() && mSipCall.getContact().isUnknown();
         boolean canDial = mOnGoingCall && mSipCall != null && !mSipCall.isIncoming();
-        boolean hasMultipleCamera = mHardwareService.getCameraCount() > 1 && mOnGoingCall && mHasVideo;
+        boolean hasMultipleCamera = mHardwareService.getCameraCount() > 1 && mOnGoingCall && !mAudioOnly;
         getView().initMenu(isSpeakerOn, hasContact, hasMultipleCamera, canDial, mOnGoingCall);
     }
 
@@ -248,9 +247,9 @@
         }
         if (mSipCall.isOnGoing()) {
             mOnGoingCall = true;
-            getView().initNormalStateDisplay(mHasVideo);
+            getView().initNormalStateDisplay(mAudioOnly);
             getView().updateContactBubble(mSipCall.getContact());
-            if (mHasVideo) {
+            if (!mAudioOnly) {
                 mHardwareService.setPreviewSettings();
                 getView().displayVideoSurface(true);
             }
diff --git a/ring-android/libringclient/src/main/java/cx/ring/call/CallView.java b/ring-android/libringclient/src/main/java/cx/ring/call/CallView.java
index aaf3998..ccccd90 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/call/CallView.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/call/CallView.java
@@ -45,7 +45,7 @@
 
     void initMenu(boolean isSpeakerOn, boolean hasContact, boolean displayFlip, boolean canDial, boolean onGoingCall);
 
-    void initNormalStateDisplay(boolean hasVideo);
+    void initNormalStateDisplay(boolean audioOnly);
 
     void initIncomingCallDisplay();
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
index 2cda845..842b66e 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationPresenter.java
@@ -171,7 +171,7 @@
         }
     }
 
-    public void callWithVideo(boolean video) {
+    public void callWithAudioOnly(boolean audioOnly) {
         Conference conf = mConversation.getCurrentCall();
 
         if (conf != null && (conf.getParticipants().get(0).getCallState() == SipCall.State.INACTIVE
@@ -183,7 +183,7 @@
         if (conf != null) {
             getView().goToCallActivity(conf.getId());
         } else {
-            getView().goToCallActivityWithResult(mAccountId, mContactRingId, video);
+            getView().goToCallActivityWithResult(mAccountId, mContactRingId, audioOnly);
         }
     }
 
diff --git a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationView.java b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationView.java
index 6acfc10..62762e3 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationView.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/conversation/ConversationView.java
@@ -55,5 +55,5 @@
 
     void goToCallActivity(String conferenceId);
 
-    void goToCallActivityWithResult(String accountId, String contactRingId, boolean hasVideo);
+    void goToCallActivityWithResult(String accountId, String contactRingId, boolean audioOnly);
 }
diff --git a/ring-android/libringclient/src/main/java/cx/ring/model/SipCall.java b/ring-android/libringclient/src/main/java/cx/ring/model/SipCall.java
index b2b7aea..71e9e8d 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/model/SipCall.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/model/SipCall.java
@@ -32,7 +32,16 @@
 import ezvcard.Ezvcard;
 
 public class SipCall {
-    private static final String TAG = SipCall.class.getSimpleName();
+
+    public final static String KEY_ACCOUNT_ID = "ACCOUNTID";
+    public final static String KEY_AUDIO_ONLY = "AUDIO_ONLY";
+    public final static String KEY_CALL_TYPE = "CALL_TYPE";
+    public final static String KEY_CALL_STATE = "CALL_STATE";
+    public final static String KEY_PEER_NUMBER = "PEER_NUMBER";
+    public final static String KEY_PEER_HOLDING = "PEER_HOLDING";
+    public final static String KEY_AUDIO_MUTED = "PEER_NUMBER";
+    public final static String KEY_VIDEO_MUTED = "VIDEO_MUTED";
+
 
     private final String mCallID;
     private final String mAccount;
@@ -42,6 +51,7 @@
     private boolean isAudioMuted = false;
     private boolean isVideoMuted = false;
     private boolean isRecording = false;
+    private boolean isAudioOnly = false;
     private long timestampStart = 0;
     private long timestampEnd = 0;
     private boolean missed = true;
@@ -49,7 +59,6 @@
     private int mCallType;
     private int mCallState = State.NONE;
 
-    private String videoSource = null;
     private ProfileChunk mProfileChunk = null;
 
     public SipCall(String id, String account, Uri number, int direction) {
@@ -81,16 +90,16 @@
 
     /**
      * *********************
-     * Construtors
+     * Constructors
      * *********************
      */
 
     public SipCall(String callId, Map<String, String> call_details) {
         this(callId,
-                call_details.get("ACCOUNTID"),
-                call_details.get("PEER_NUMBER"),
-                Integer.parseInt(call_details.get("CALL_TYPE")));
-        mCallState = stateFromString(call_details.get("CALL_STATE"));
+                call_details.get(KEY_ACCOUNT_ID),
+                call_details.get(KEY_PEER_NUMBER),
+                Integer.parseInt(call_details.get(KEY_CALL_TYPE)));
+        mCallState = stateFromString(call_details.get(KEY_CALL_STATE));
         setDetails(call_details);
     }
 
@@ -108,28 +117,20 @@
     }
 
     public void setDetails(Map<String, String> details) {
-        isPeerHolding = "true".equals(details.get("PEER_HOLDING"));
-        isAudioMuted = "true".equals(details.get("AUDIO_MUTED"));
-        isVideoMuted = "true".equals(details.get("VIDEO_MUTED"));
-        videoSource = details.get("VIDEO_SOURCE");
+        isPeerHolding = "true".equals(details.get(KEY_PEER_HOLDING));
+        isAudioMuted = "true".equals(details.get(KEY_AUDIO_MUTED));
+        isVideoMuted = "true".equals(details.get(KEY_VIDEO_MUTED));
+        isAudioOnly = "true".equals(details.get(KEY_AUDIO_ONLY));
     }
 
     public long getDuration() {
         return isMissed() ? 0 : timestampEnd - timestampStart;
     }
 
-    public String getVideoSource() {
-        return videoSource;
-    }
-
     public void muteVideo(boolean mute) {
         isVideoMuted = mute;
     }
 
-    public boolean isVideoMuted() {
-        return isVideoMuted;
-    }
-
     public interface Direction {
         int INCOMING = 0;
         int OUTGOING = 1;
@@ -200,6 +201,10 @@
         mNumber = n;
     }
 
+    public boolean isAudioOnly() {
+        return isAudioOnly;
+    }
+
     public String getNumber() {
         return mNumber.getUriString();
     }
@@ -208,38 +213,6 @@
         return mNumber;
     }
 
-    public String stateToString() {
-        return stateToString(mCallState);
-    }
-
-    public static String stateToString(int state) {
-        switch (state) {
-            case State.SEARCHING:
-                return "SEARCHING";
-            case State.CONNECTING:
-                return "CONNECTING";
-            case State.RINGING:
-                return "RINGING";
-            case State.CURRENT:
-                return "CURRENT";
-            case State.HUNGUP:
-                return "HUNGUP";
-            case State.BUSY:
-                return "BUSY";
-            case State.FAILURE:
-                return "FAILURE";
-            case State.HOLD:
-                return "HOLD";
-            case State.UNHOLD:
-                return "UNHOLD";
-            case State.OVER:
-                return "OVER";
-            case State.NONE:
-            default:
-                return "NONE";
-        }
-    }
-
     public static int stateFromString(String state) {
         switch (state) {
             case "SEARCHING":
@@ -270,21 +243,6 @@
         }
     }
 
-    public boolean isRecording() {
-        return isRecording;
-    }
-
-    public void setRecording(boolean isRecording) {
-        this.isRecording = isRecording;
-    }
-
-    public void printCallInfo() {
-        Log.i(TAG, "CallInfo: CallID: " + mCallID);
-        Log.i(TAG, "          AccountID: " + mAccount);
-        Log.i(TAG, "          CallState: " + stateToString());
-        Log.i(TAG, "          CallType: " + mCallType);
-    }
-
     /**
      * Compare sip calls based on call ID
      */
@@ -309,17 +267,13 @@
         return mCallState == State.CURRENT || mCallState == State.HOLD || mCallState == State.UNHOLD;
     }
 
-    public boolean isOnHold() {
-        return mCallState == State.HOLD;
-    }
-
     public boolean isCurrent() {
         return mCallState == State.CURRENT;
     }
 
-    public boolean appendToVCard(String from, StringMap messages) {
+    public boolean appendToVCard(StringMap messages) {
         StringVect keys = messages.keys();
-        for (int i=0, n=keys.size(); i<n; i++) {
+        for (int i = 0, n = keys.size(); i < n; i++) {
             String key = keys.get(i);
             HashMap<String, String> messageKeyValue = VCardUtils.parseMimeAttributes(key);
             String mimeType = messageKeyValue.get(VCardUtils.VCARD_KEY_MIME_TYPE);
diff --git a/ring-android/libringclient/src/main/java/cx/ring/services/CallService.java b/ring-android/libringclient/src/main/java/cx/ring/services/CallService.java
index 4f5d1ef..f70639c 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/services/CallService.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/services/CallService.java
@@ -69,7 +69,7 @@
         return mCallbackHandler;
     }
 
-    public SipCall placeCall(final String account, final String number, final boolean video) {
+    public SipCall placeCall(final String account, final String number, final boolean audioOnly) {
         return FutureUtils.executeDaemonThreadCallable(
                 mExecutor,
                 mDeviceRuntimeService.provideDaemonThreadId(),
@@ -77,16 +77,20 @@
                 new Callable<SipCall>() {
                     @Override
                     public SipCall call() throws Exception {
-                        Log.i(TAG, "placeCall() thread running... " + number + " video: " + video);
-                        String callId = Ringservice.placeCall(account, number);
+                        Log.i(TAG, "placeCall() thread running... " + number + " audioOnly: " + audioOnly);
+
+                        HashMap<String, String> volatileDetails = new HashMap<>();
+                        volatileDetails.put(SipCall.KEY_AUDIO_ONLY, String.valueOf(audioOnly));
+
+                        String callId = Ringservice.placeCall(account, number, StringMap.toSwig(volatileDetails));
                         if (callId == null || callId.isEmpty())
                             return null;
-                        if (!video) {
+                        if (audioOnly) {
                             Ringservice.muteLocalMedia(callId, "MEDIA_TYPE_VIDEO", true);
                         }
                         CallContact contact = mContactService.findContactByNumber(number);
                         SipCall call = addCall(account, callId, number, SipCall.Direction.OUTGOING);
-                        call.muteVideo(!video);
+                        call.muteVideo(audioOnly);
                         call.setContact(contact);
                         return call;
                     }
@@ -362,7 +366,7 @@
         return false;
     }
 
-    public void stopRecordedFilePlayback(final String filepath) {
+    public void stopRecordedFilePlayback() {
         FutureUtils.executeDaemonThreadCallable(
                 mExecutor,
                 mDeviceRuntimeService.provideDaemonThreadId(),
@@ -371,7 +375,7 @@
                     @Override
                     public Boolean call() throws Exception {
                         Log.i(TAG, "stopRecordedFilePlayback() thread running...");
-                        Ringservice.stopRecordedFilePlayback(filepath);
+                        Ringservice.stopRecordedFilePlayback();
                         return true;
                     }
                 }
@@ -521,7 +525,7 @@
                 Log.w(TAG, "incomingMessage: unknown call or no message: " + callId + " " + from);
                 return;
             }
-            if (sipCall.appendToVCard(from, messages)) {
+            if (sipCall.appendToVCard(messages)) {
                 mContactService.saveVCardContactData(sipCall.getContact());
             }
             if (messages.has_key(MIME_TEXT_PLAIN)) {
diff --git a/ring-android/libringclient/src/main/jni/callmanager.i b/ring-android/libringclient/src/main/jni/callmanager.i
index 39c1bf0..845b1c3 100644
--- a/ring-android/libringclient/src/main/jni/callmanager.i
+++ b/ring-android/libringclient/src/main/jni/callmanager.i
@@ -58,7 +58,7 @@
 namespace DRing {
 
 /* Call related methods */
-std::string placeCall(const std::string& accountID, const std::string& to);
+std::string placeCall(const std::string& accountID, const std::string& to, const std::map<std::string, std::string>& VolatileCallDetails);
 
 bool refuse(const std::string& callID);
 bool accept(const std::string& callID);
@@ -91,7 +91,7 @@
 
 /* File Playback methods */
 bool startRecordedFilePlayback(const std::string& filepath);
-void stopRecordedFilePlayback(const std::string& filepath);
+void stopRecordedFilePlayback();
 
 /* General audio methods */
 bool toggleRecording(const std::string& callID);