Can hang up conversation

This commit is contained in:
Pierre HUBERT 2019-02-26 17:22:36 +01:00
parent f08f1940fc
commit 959afda2cf
8 changed files with 129 additions and 2 deletions

View File

@ -239,6 +239,24 @@ public class CallsHelper extends BaseHelper {
} }
} }
/**
* Hang up a call
*
* @param callID Target call ID
* @return TRUE for a success / FALSE else
*/
public boolean hangUp(int callID){
APIRequest request = new APIRequest(getContext(), "calls/hangUp");
request.addInt("call_id", callID);
try {
return request.exec().getJSONObject().has("success");
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/** /**
* Turn a {@link JSONObject} object into a {@link CallsConfiguration} object. * Turn a {@link JSONObject} object into a {@link CallsConfiguration} object.

View File

@ -8,6 +8,8 @@ import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.util.Log; import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
@ -23,6 +25,7 @@ import org.communiquons.android.comunic.client.data.models.CallsConfiguration;
import org.communiquons.android.comunic.client.data.utils.AccountUtils; import org.communiquons.android.comunic.client.data.utils.AccountUtils;
import org.communiquons.android.comunic.client.ui.arrays.CallPeersConnectionsList; import org.communiquons.android.comunic.client.ui.arrays.CallPeersConnectionsList;
import org.communiquons.android.comunic.client.ui.asynctasks.GetCallInformationTask; import org.communiquons.android.comunic.client.ui.asynctasks.GetCallInformationTask;
import org.communiquons.android.comunic.client.ui.asynctasks.HangUpCallTask;
import org.communiquons.android.comunic.client.ui.asynctasks.RespondToCallTask; import org.communiquons.android.comunic.client.ui.asynctasks.RespondToCallTask;
import org.communiquons.android.comunic.client.ui.models.CallPeerConnection; import org.communiquons.android.comunic.client.ui.models.CallPeerConnection;
import org.communiquons.android.comunic.client.ui.receivers.PendingCallsBroadcastReceiver; import org.communiquons.android.comunic.client.ui.receivers.PendingCallsBroadcastReceiver;
@ -85,6 +88,11 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
*/ */
private SignalExchangerClient mSignalExchangerClient = null; private SignalExchangerClient mSignalExchangerClient = null;
/**
* Specify whether call was stopped or not
*/
private boolean mStopped = false;
/** /**
* Connections list * Connections list
@ -102,6 +110,7 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
* Views * Views
*/ */
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private ImageButton mHangUpButton;
@Override @Override
@ -184,7 +193,8 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
private void initViews(){ private void initViews(){
mProgressBar = findViewById(R.id.progressBar); mProgressBar = findViewById(R.id.progressBar);
mHangUpButton = findViewById(R.id.hangUp);
mHangUpButton.setOnClickListener(v -> hangUp());
} }
@ -214,6 +224,8 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
*/ */
private void onGotCallInformation(@Nullable CallInformation info){ private void onGotCallInformation(@Nullable CallInformation info){
if(mStopped) return;
if(info == null){ if(info == null){
Toast.makeText(this, R.string.err_get_call_info, Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.err_get_call_info, Toast.LENGTH_SHORT).show();
return; return;
@ -225,7 +237,7 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
//Check if everyone left the conversation //Check if everyone left the conversation
if(mCallInformation.hasAllMembersLeftCallExcept(AccountUtils.getID(this))){ if(mCallInformation.hasAllMembersLeftCallExcept(AccountUtils.getID(this))){
Toast.makeText(this, R.string.notice_call_terminated, Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.notice_call_terminated, Toast.LENGTH_SHORT).show();
finish(); hangUp();
return; return;
} }
@ -258,6 +270,9 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
private void processClientsConnections(){ private void processClientsConnections(){
if(mStopped) return;
//Process each peer connection //Process each peer connection
for(CallMember member : mCallInformation.getMembers()) for(CallMember member : mCallInformation.getMembers())
processClientConnection(member); processClientConnection(member);
@ -294,6 +309,8 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
*/ */
private void createPeerConnection(CallMember member, boolean isInitiator){ private void createPeerConnection(CallMember member, boolean isInitiator){
if(mStopped) return;
Log.v(TAG, "Create peer connection for connection with user " + member.getUserID()); Log.v(TAG, "Create peer connection for connection with user " + member.getUserID());
CallPeerConnection callPeer = new CallPeerConnection(member); CallPeerConnection callPeer = new CallPeerConnection(member);
@ -359,10 +376,12 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
ProxyVideoSink localProxyVideoSink = new ProxyVideoSink(); ProxyVideoSink localProxyVideoSink = new ProxyVideoSink();
localProxyVideoSink.setTarget(callPeer.getLocalVideoView()); localProxyVideoSink.setTarget(callPeer.getLocalVideoView());
callPeer.setLocalProxyVideoSink(localProxyVideoSink);
ProxyVideoSink remoteProxyRenderer = new ProxyVideoSink(); ProxyVideoSink remoteProxyRenderer = new ProxyVideoSink();
remoteProxyRenderer.setTarget(callPeer.getRemoteViewView()); remoteProxyRenderer.setTarget(callPeer.getRemoteViewView());
callPeer.getRemoteSinks().add(remoteProxyRenderer); callPeer.getRemoteSinks().add(remoteProxyRenderer);
callPeer.setRemoteProxyRenderer(remoteProxyRenderer);
//Start connection //Start connection
peerConnectionClient.createPeerConnection( peerConnectionClient.createPeerConnection(
@ -376,6 +395,27 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
peerConnectionClient.createOffer(); peerConnectionClient.createOffer();
} }
/**
* Hang up call
*/
private void hangUp(){
mHangUpButton.setVisibility(View.GONE);
mStopped = true;
mRefreshCallInformation.interrupt();
mSignalExchangerClient.close();
for (CallPeerConnection client : mList)
disconnectFromPeer(client.getMember());
HangUpCallTask hangUpCallTask = new HangUpCallTask(getApplicationContext());
hangUpCallTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mCallID);
finish();
}
/** /**
* Disconnect from a specific peer * Disconnect from a specific peer
* *
@ -387,6 +427,9 @@ public class CallActivity extends BaseActivity implements SignalExchangerCallbac
if(callPeer == null) if(callPeer == null)
return; return;
((ProxyVideoSink)callPeer.getLocalProxyVideoSink()).setTarget(null);
((ProxyVideoSink)callPeer.getRemoteProxyRenderer()).setTarget(null);
callPeer.getPeerConnectionClient().close(); callPeer.getPeerConnectionClient().close();
mList.remove(callPeer); mList.remove(callPeer);

View File

@ -0,0 +1,23 @@
package org.communiquons.android.comunic.client.ui.asynctasks;
import android.content.Context;
import org.communiquons.android.comunic.client.data.helpers.CallsHelper;
/**
* Hang up a call
*
* @author Pierre HUBERT
*/
public class HangUpCallTask extends SafeAsyncTask<Integer, Void, Boolean> {
public HangUpCallTask(Context context) {
super(context);
}
@Override
protected Boolean doInBackground(Integer... integers) {
return new CallsHelper(getContext()).hangUp(integers[0]);
}
}

View File

@ -17,6 +17,8 @@ public class CallPeerConnection {
//Private fields //Private fields
private CallMember member; private CallMember member;
private PeerConnectionClient peerConnectionClient; private PeerConnectionClient peerConnectionClient;
private VideoSink localProxyVideoSink;
private VideoSink remoteProxyRenderer;
private ArrayList<VideoSink> remoteSinks = new ArrayList<>(); private ArrayList<VideoSink> remoteSinks = new ArrayList<>();
//Views //Views
@ -67,4 +69,20 @@ public class CallPeerConnection {
public void setLocalVideoView(SurfaceViewRenderer mLocalVideoView) { public void setLocalVideoView(SurfaceViewRenderer mLocalVideoView) {
this.mLocalVideoView = mLocalVideoView; this.mLocalVideoView = mLocalVideoView;
} }
public VideoSink getLocalProxyVideoSink() {
return localProxyVideoSink;
}
public void setLocalProxyVideoSink(VideoSink localProxyVideoSink) {
this.localProxyVideoSink = localProxyVideoSink;
}
public VideoSink getRemoteProxyRenderer() {
return remoteProxyRenderer;
}
public void setRemoteProxyRenderer(VideoSink remoteProxyRenderer) {
this.remoteProxyRenderer = remoteProxyRenderer;
}
} }

View File

@ -71,6 +71,14 @@ public class SignalExchangerClient extends WebSocketListener {
mWebSocket = mClient.newWebSocket(request, this); mWebSocket = mClient.newWebSocket(request, this);
} }
/**
* Close this socket
*/
public void close(){
if(mWebSocket != null)
mWebSocket.close(4999, null);
}
/** /**
* Get current client configuration * Get current client configuration
* *

View File

@ -20,4 +20,19 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/hangUp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:backgroundTint="@color/holo_red_dark"
android:src="@drawable/ic_call"
android:tint="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:contentDescription="@string/action_hang_up"/>
</android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>

View File

@ -332,4 +332,5 @@
<string name="err_get_call_info">Impossible de récupérer les infoamtions sur l\'appel !</string> <string name="err_get_call_info">Impossible de récupérer les infoamtions sur l\'appel !</string>
<string name="err_connect_signaling_server">Impossible de connecter au signaling server !</string> <string name="err_connect_signaling_server">Impossible de connecter au signaling server !</string>
<string name="notice_call_terminated">Appel terminé.</string> <string name="notice_call_terminated">Appel terminé.</string>
<string name="action_hang_up">Raccrocher</string>
</resources> </resources>

View File

@ -331,4 +331,5 @@
<string name="err_get_call_info">Could not get call information!</string> <string name="err_get_call_info">Could not get call information!</string>
<string name="err_connect_signaling_server">Could not connect to signaling server!</string> <string name="err_connect_signaling_server">Could not connect to signaling server!</string>
<string name="notice_call_terminated">Call terminated</string> <string name="notice_call_terminated">Call terminated</string>
<string name="action_hang_up">Hang up</string>
</resources> </resources>