display status information in ui
This commit is contained in:
parent
a9a35fb74b
commit
0e88b56eb4
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||||
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.READ_PHONE_STATE"
|
android:name="android.permission.READ_PHONE_STATE"
|
||||||
|
|
|
@ -37,8 +37,13 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
|
||||||
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
|
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
this.binding = DataBindingUtil.setContentView(this, R.layout.activity_rtp_session);
|
this.binding = DataBindingUtil.setContentView(this, R.layout.activity_rtp_session);
|
||||||
this.binding.acceptCall.setOnClickListener(this::acceptCall);
|
|
||||||
this.binding.rejectCall.setOnClickListener(this::rejectCall);
|
this.binding.rejectCall.setOnClickListener(this::rejectCall);
|
||||||
|
this.binding.endCall.setOnClickListener(this::endCall);
|
||||||
|
this.binding.acceptCall.setOnClickListener(this::acceptCall);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void endCall(View view) {
|
||||||
|
requireRtpConnection().endCall();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rejectCall(View view) {
|
private void rejectCall(View view) {
|
||||||
|
@ -70,11 +75,13 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
|
||||||
}
|
}
|
||||||
this.rtpConnectionReference = reference;
|
this.rtpConnectionReference = reference;
|
||||||
binding.with.setText(getWith().getDisplayName());
|
binding.with.setText(getWith().getDisplayName());
|
||||||
showState(requireRtpConnection().getEndUserState());
|
final RtpEndUserState currentState = requireRtpConnection().getEndUserState();
|
||||||
|
updateStateDisplay(currentState);
|
||||||
|
updateButtonConfiguration(currentState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showState(final RtpEndUserState state) {
|
private void updateStateDisplay(final RtpEndUserState state) {
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case INCOMING_CALL:
|
case INCOMING_CALL:
|
||||||
binding.status.setText(R.string.rtp_state_incoming_call);
|
binding.status.setText(R.string.rtp_state_incoming_call);
|
||||||
|
@ -88,6 +95,25 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
|
||||||
case ACCEPTING_CALL:
|
case ACCEPTING_CALL:
|
||||||
binding.status.setText(R.string.rtp_state_accepting_call);
|
binding.status.setText(R.string.rtp_state_accepting_call);
|
||||||
break;
|
break;
|
||||||
|
case ENDING_CALL:
|
||||||
|
binding.status.setText(R.string.rtp_state_ending_call);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateButtonConfiguration(final RtpEndUserState state) {
|
||||||
|
if (state == RtpEndUserState.INCOMING_CALL) {
|
||||||
|
this.binding.rejectCall.show();
|
||||||
|
this.binding.endCall.hide();
|
||||||
|
this.binding.acceptCall.show();
|
||||||
|
} else if (state == RtpEndUserState.ENDING_CALL) {
|
||||||
|
this.binding.rejectCall.hide();
|
||||||
|
this.binding.endCall.hide();
|
||||||
|
this.binding.acceptCall.hide();
|
||||||
|
} else {
|
||||||
|
this.binding.rejectCall.hide();
|
||||||
|
this.binding.endCall.show();
|
||||||
|
this.binding.acceptCall.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +136,8 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
|
||||||
final AbstractJingleConnection.Id id = requireRtpConnection().getId();
|
final AbstractJingleConnection.Id id = requireRtpConnection().getId();
|
||||||
if (account == id.account && id.with.equals(with)) {
|
if (account == id.account && id.with.equals(with)) {
|
||||||
runOnUiThread(()->{
|
runOnUiThread(()->{
|
||||||
showState(state);
|
updateStateDisplay(state);
|
||||||
|
updateButtonConfiguration(state);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
Log.d(Config.LOGTAG,"received update for other rtp session");
|
Log.d(Config.LOGTAG,"received update for other rtp session");
|
||||||
|
|
|
@ -317,6 +317,8 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
||||||
return RtpEndUserState.CONNECTED;
|
return RtpEndUserState.CONNECTED;
|
||||||
} else if (state == PeerConnection.PeerConnectionState.NEW || state == PeerConnection.PeerConnectionState.CONNECTING) {
|
} else if (state == PeerConnection.PeerConnectionState.NEW || state == PeerConnection.PeerConnectionState.CONNECTING) {
|
||||||
return RtpEndUserState.CONNECTING;
|
return RtpEndUserState.CONNECTING;
|
||||||
|
} else if (state == PeerConnection.PeerConnectionState.CLOSED) {
|
||||||
|
return RtpEndUserState.ENDING_CALL;
|
||||||
} else {
|
} else {
|
||||||
return RtpEndUserState.FAILED;
|
return RtpEndUserState.FAILED;
|
||||||
}
|
}
|
||||||
|
@ -342,6 +344,14 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
||||||
Log.d(Config.LOGTAG, "todo rejecting call");
|
Log.d(Config.LOGTAG, "todo rejecting call");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void endCall() {
|
||||||
|
if (isInState(State.SESSION_INITIALIZED, State.SESSION_ACCEPTED)) {
|
||||||
|
webRTCWrapper.close();
|
||||||
|
} else {
|
||||||
|
Log.d(Config.LOGTAG, id.account.getJid().asBareJid() + ": called 'endCall' while in state " + this.state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void setupWebRTC() {
|
private void setupWebRTC() {
|
||||||
this.webRTCWrapper.setup(this.xmppConnectionService);
|
this.webRTCWrapper.setup(this.xmppConnectionService);
|
||||||
this.webRTCWrapper.initializePeerConnection();
|
this.webRTCWrapper.initializePeerConnection();
|
||||||
|
@ -392,6 +402,7 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onConnectionChange(PeerConnection.PeerConnectionState newState) {
|
public void onConnectionChange(PeerConnection.PeerConnectionState newState) {
|
||||||
|
Log.d(Config.LOGTAG,id.account.getJid().asBareJid()+": PeerConnectionState changed to "+newState);
|
||||||
updateEndUserState();
|
updateEndUserState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,5 +8,6 @@ public enum RtpEndUserState {
|
||||||
RINGING, //'propose' has been sent out and it has been 184 acked
|
RINGING, //'propose' has been sent out and it has been 184 acked
|
||||||
ACCEPTED_ON_OTHER_DEVICE, //received 'accept' from one of our own devices
|
ACCEPTED_ON_OTHER_DEVICE, //received 'accept' from one of our own devices
|
||||||
ACCEPTING_CALL, //'proceed' message has been sent; but no session-initiate has been received
|
ACCEPTING_CALL, //'proceed' message has been sent; but no session-initiate has been received
|
||||||
|
ENDING_CALL, //libwebrt says 'closed' but session-terminate hasnt gone through
|
||||||
FAILED //something went wrong. TODO needs more concrete error states
|
FAILED //something went wrong. TODO needs more concrete error states
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,6 +200,9 @@ public class WebRTCWrapper {
|
||||||
this.peerConnection = peerConnection;
|
this.peerConnection = peerConnection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
requirePeerConnection().close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public ListenableFuture<SessionDescription> createOffer() {
|
public ListenableFuture<SessionDescription> createOffer() {
|
||||||
|
@ -287,15 +290,19 @@ public class WebRTCWrapper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addIceCandidate(IceCandidate iceCandidate) {
|
public void addIceCandidate(IceCandidate iceCandidate) {
|
||||||
|
requirePeerConnection().addIceCandidate(iceCandidate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PeerConnection.PeerConnectionState getState() {
|
||||||
|
return requirePeerConnection().connectionState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private PeerConnection requirePeerConnection() {
|
||||||
final PeerConnection peerConnection = this.peerConnection;
|
final PeerConnection peerConnection = this.peerConnection;
|
||||||
if (peerConnection == null) {
|
if (peerConnection == null) {
|
||||||
throw new IllegalStateException("initialize PeerConnection first");
|
throw new IllegalStateException("initialize PeerConnection first");
|
||||||
}
|
}
|
||||||
peerConnection.addIceCandidate(iceCandidate);
|
return peerConnection;
|
||||||
}
|
|
||||||
|
|
||||||
public PeerConnection.PeerConnectionState getState() {
|
|
||||||
return this.peerConnection.connectionState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static abstract class SetSdpObserver implements SdpObserver {
|
private static abstract class SetSdpObserver implements SdpObserver {
|
||||||
|
@ -329,6 +336,7 @@ public class WebRTCWrapper {
|
||||||
|
|
||||||
public interface EventCallback {
|
public interface EventCallback {
|
||||||
void onIceCandidate(IceCandidate iceCandidate);
|
void onIceCandidate(IceCandidate iceCandidate);
|
||||||
|
|
||||||
void onConnectionChange(PeerConnection.PeerConnectionState newState);
|
void onConnectionChange(PeerConnection.PeerConnectionState newState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,22 @@
|
||||||
app:backgroundTint="@color/red700"
|
app:backgroundTint="@color/red700"
|
||||||
app:elevation="4dp"
|
app:elevation="4dp"
|
||||||
app:fabCustomSize="72dp"
|
app:fabCustomSize="72dp"
|
||||||
app:maxImageSize="36dp" />
|
app:maxImageSize="36dp"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:visibility="visible"/>
|
||||||
|
|
||||||
|
<android.support.design.widget.FloatingActionButton
|
||||||
|
android:id="@+id/end_call"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_margin="16dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:src="@drawable/ic_call_end_white_48dp"
|
||||||
|
app:backgroundTint="@color/red700"
|
||||||
|
app:elevation="4dp"
|
||||||
|
app:fabCustomSize="72dp"
|
||||||
|
app:maxImageSize="36dp"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
<android.support.design.widget.FloatingActionButton
|
<android.support.design.widget.FloatingActionButton
|
||||||
android:id="@+id/accept_call"
|
android:id="@+id/accept_call"
|
||||||
|
@ -68,7 +83,9 @@
|
||||||
app:backgroundTint="@color/green700"
|
app:backgroundTint="@color/green700"
|
||||||
app:elevation="4dp"
|
app:elevation="4dp"
|
||||||
app:fabCustomSize="72dp"
|
app:fabCustomSize="72dp"
|
||||||
app:maxImageSize="36dp" />
|
app:maxImageSize="36dp"
|
||||||
|
android:visibility="gone"
|
||||||
|
tools:visibility="visible"/>
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
|
@ -889,6 +889,7 @@
|
||||||
<string name="rtp_state_connecting">Connecting</string>
|
<string name="rtp_state_connecting">Connecting</string>
|
||||||
<string name="rtp_state_connected">Connected</string>
|
<string name="rtp_state_connected">Connected</string>
|
||||||
<string name="rtp_state_accepting_call">Accepting call</string>
|
<string name="rtp_state_accepting_call">Accepting call</string>
|
||||||
|
<string name="rtp_state_ending_call">Ending call</string>
|
||||||
<plurals name="view_users">
|
<plurals name="view_users">
|
||||||
<item quantity="one">View %1$d Participant</item>
|
<item quantity="one">View %1$d Participant</item>
|
||||||
<item quantity="other">View %1$d Participants</item>
|
<item quantity="other">View %1$d Participants</item>
|
||||||
|
|
Loading…
Reference in a new issue