From 01a9a5299067c846d87d24cc2ca62b06c7bdb173 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 15 Apr 2020 19:16:47 +0200 Subject: [PATCH] show enable/disable video in video calls --- .../conversations/ui/RtpSessionActivity.java | 96 ++++++++++++------ .../xmpp/jingle/JingleRtpConnection.java | 8 ++ .../xmpp/jingle/WebRTCWrapper.java | 20 +++- .../ic_videocam_off_black_24dp.png | Bin 0 -> 260 bytes .../ic_videocam_off_black_24dp.png | Bin 0 -> 193 bytes .../ic_videocam_off_black_24dp.png | Bin 0 -> 274 bytes .../ic_videocam_off_black_24dp.png | Bin 0 -> 375 bytes .../ic_videocam_off_black_24dp.png | Bin 0 -> 447 bytes 8 files changed, 89 insertions(+), 35 deletions(-) create mode 100644 src/main/res/drawable-hdpi/ic_videocam_off_black_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_videocam_off_black_24dp.png create mode 100644 src/main/res/drawable-xhdpi/ic_videocam_off_black_24dp.png create mode 100644 src/main/res/drawable-xxhdpi/ic_videocam_off_black_24dp.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_videocam_off_black_24dp.png diff --git a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java index ba22604e4..4c4a35d0c 100644 --- a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java @@ -410,12 +410,16 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe @SuppressLint("RestrictedApi") private void updateInCallButtonConfiguration(final RtpEndUserState state) { if (state == RtpEndUserState.CONNECTED) { - final AppRTCAudioManager audioManager = requireRtpConnection().getAudioManager(); - updateInCallButtonConfiguration( - audioManager.getSelectedAudioDevice(), - audioManager.getAudioDevices().size(), - requireRtpConnection().isMicrophoneEnabled() - ); + if (getMedia().contains(Media.VIDEO)) { + updateInCallButtonConfigurationVideo(requireRtpConnection().isVideoEnabled()); + } else { + final AppRTCAudioManager audioManager = requireRtpConnection().getAudioManager(); + updateInCallButtonConfigurationSpeaker( + audioManager.getSelectedAudioDevice(), + audioManager.getAudioDevices().size() + ); + } + updateInCallButtonConfigurationMicrophone(requireRtpConnection().isMicrophoneEnabled()); } else { this.binding.inCallActionLeft.setVisibility(View.GONE); this.binding.inCallActionRight.setVisibility(View.GONE); @@ -423,48 +427,75 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe } @SuppressLint("RestrictedApi") - private void updateInCallButtonConfiguration(final AppRTCAudioManager.AudioDevice selectedAudioDevice, final int numberOfChoices, final boolean microphoneEnabled) { + private void updateInCallButtonConfigurationSpeaker(final AppRTCAudioManager.AudioDevice selectedAudioDevice, final int numberOfChoices) { switch (selectedAudioDevice) { case EARPIECE: - this.binding.inCallActionLeft.setImageResource(R.drawable.ic_volume_off_black_24dp); + this.binding.inCallActionRight.setImageResource(R.drawable.ic_volume_off_black_24dp); if (numberOfChoices >= 2) { - this.binding.inCallActionLeft.setOnClickListener(this::switchToSpeaker); + this.binding.inCallActionRight.setOnClickListener(this::switchToSpeaker); } else { - this.binding.inCallActionLeft.setOnClickListener(null); - this.binding.inCallActionLeft.setClickable(false); + this.binding.inCallActionRight.setOnClickListener(null); + this.binding.inCallActionRight.setClickable(false); } break; case WIRED_HEADSET: - this.binding.inCallActionLeft.setImageResource(R.drawable.ic_headset_black_24dp); - this.binding.inCallActionLeft.setOnClickListener(null); - this.binding.inCallActionLeft.setClickable(false); + this.binding.inCallActionRight.setImageResource(R.drawable.ic_headset_black_24dp); + this.binding.inCallActionRight.setOnClickListener(null); + this.binding.inCallActionRight.setClickable(false); break; case SPEAKER_PHONE: - this.binding.inCallActionLeft.setImageResource(R.drawable.ic_volume_up_black_24dp); + this.binding.inCallActionRight.setImageResource(R.drawable.ic_volume_up_black_24dp); if (numberOfChoices >= 2) { - this.binding.inCallActionLeft.setOnClickListener(this::switchToEarpiece); + this.binding.inCallActionRight.setOnClickListener(this::switchToEarpiece); } else { - this.binding.inCallActionLeft.setOnClickListener(null); - this.binding.inCallActionLeft.setClickable(false); + this.binding.inCallActionRight.setOnClickListener(null); + this.binding.inCallActionRight.setClickable(false); } break; case BLUETOOTH: - this.binding.inCallActionLeft.setImageResource(R.drawable.ic_bluetooth_audio_black_24dp); - this.binding.inCallActionLeft.setOnClickListener(null); - this.binding.inCallActionLeft.setClickable(false); + this.binding.inCallActionRight.setImageResource(R.drawable.ic_bluetooth_audio_black_24dp); + this.binding.inCallActionRight.setOnClickListener(null); + this.binding.inCallActionRight.setClickable(false); break; } - this.binding.inCallActionLeft.setVisibility(View.VISIBLE); - if (microphoneEnabled) { - this.binding.inCallActionRight.setImageResource(R.drawable.ic_mic_black_24dp); - this.binding.inCallActionRight.setOnClickListener(this::disableMicrophone); - } else { - this.binding.inCallActionRight.setImageResource(R.drawable.ic_mic_off_black_24dp); - this.binding.inCallActionRight.setOnClickListener(this::enableMicrophone); - } this.binding.inCallActionRight.setVisibility(View.VISIBLE); } + @SuppressLint("RestrictedApi") + private void updateInCallButtonConfigurationVideo(final boolean videoEnabled) { + this.binding.inCallActionRight.setVisibility(View.VISIBLE); + if (videoEnabled) { + this.binding.inCallActionRight.setImageResource(R.drawable.ic_videocam_black_24dp); + this.binding.inCallActionRight.setOnClickListener(this::disableVideo); + } else { + this.binding.inCallActionRight.setImageResource(R.drawable.ic_videocam_off_black_24dp); + this.binding.inCallActionRight.setOnClickListener(this::enableVideo); + } + } + + private void enableVideo(View view) { + requireRtpConnection().setVideoEnabled(true); + updateInCallButtonConfigurationVideo(true); + } + + private void disableVideo(View view) { + requireRtpConnection().setVideoEnabled(false); + updateInCallButtonConfigurationVideo(false); + + } + + @SuppressLint("RestrictedApi") + private void updateInCallButtonConfigurationMicrophone(final boolean microphoneEnabled) { + if (microphoneEnabled) { + this.binding.inCallActionLeft.setImageResource(R.drawable.ic_mic_black_24dp); + this.binding.inCallActionLeft.setOnClickListener(this::disableMicrophone); + } else { + this.binding.inCallActionLeft.setImageResource(R.drawable.ic_mic_off_black_24dp); + this.binding.inCallActionLeft.setOnClickListener(this::enableMicrophone); + } + this.binding.inCallActionLeft.setVisibility(View.VISIBLE); + } + private void updateVideoViews() { final Optional localVideoTrack = requireRtpConnection().geLocalVideoTrack(); if (localVideoTrack.isPresent()) { @@ -572,12 +603,11 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe public void onAudioDeviceChanged(AppRTCAudioManager.AudioDevice selectedAudioDevice, Set availableAudioDevices) { Log.d(Config.LOGTAG, "onAudioDeviceChanged in activity: selected:" + selectedAudioDevice + ", available:" + availableAudioDevices); try { - if (requireRtpConnection().getEndUserState() == RtpEndUserState.CONNECTED) { + if (requireRtpConnection().getEndUserState() == RtpEndUserState.CONNECTED && !getMedia().contains(Media.VIDEO)) { final AppRTCAudioManager audioManager = requireRtpConnection().getAudioManager(); - updateInCallButtonConfiguration( + updateInCallButtonConfigurationSpeaker( audioManager.getSelectedAudioDevice(), - audioManager.getAudioDevices().size(), - requireRtpConnection().isMicrophoneEnabled() + audioManager.getAudioDevices().size() ); } putProximityWakeLockInProperState(); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java index 317dd7cf0..976e3ad3e 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java @@ -930,6 +930,14 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web webRTCWrapper.setMicrophoneEnabled(enabled); } + public boolean isVideoEnabled() { + return webRTCWrapper.isVideoEnabled(); + } + + public void setVideoEnabled(final boolean enabled) { + webRTCWrapper.setVideoEnabled(enabled); + } + @Override public void onAudioDeviceChanged(AppRTCAudioManager.AudioDevice selectedAudioDevice, Set availableAudioDevices) { xmppConnectionService.notifyJingleRtpConnectionUpdate(selectedAudioDevice, availableAudioDevices); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java index 8e87291cd..70c4f8e7b 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java @@ -228,7 +228,7 @@ public class WebRTCWrapper { } } - public boolean isMicrophoneEnabled() { + boolean isMicrophoneEnabled() { final AudioTrack audioTrack = this.localAudioTrack; if (audioTrack == null) { throw new IllegalStateException("Local audio track does not exist (yet)"); @@ -236,7 +236,7 @@ public class WebRTCWrapper { return audioTrack.enabled(); } - public void setMicrophoneEnabled(final boolean enabled) { + void setMicrophoneEnabled(final boolean enabled) { final AudioTrack audioTrack = this.localAudioTrack; if (audioTrack == null) { throw new IllegalStateException("Local audio track does not exist (yet)"); @@ -244,6 +244,22 @@ public class WebRTCWrapper { audioTrack.setEnabled(enabled); } + public boolean isVideoEnabled() { + final VideoTrack videoTrack = this.localVideoTrack; + if (videoTrack == null) { + throw new IllegalStateException("Local video track does not exist"); + } + return videoTrack.enabled(); + } + + public void setVideoEnabled(final boolean enabled) { + final VideoTrack videoTrack = this.localVideoTrack; + if (videoTrack == null) { + throw new IllegalStateException("Local video track does not exist"); + } + videoTrack.setEnabled(enabled); + } + public ListenableFuture createOffer() { return Futures.transformAsync(getPeerConnectionFuture(), peerConnection -> { final SettableFuture future = SettableFuture.create(); diff --git a/src/main/res/drawable-hdpi/ic_videocam_off_black_24dp.png b/src/main/res/drawable-hdpi/ic_videocam_off_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..06140f119b52d79a175c37a706eaa22ee883ffeb GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpX-^l&kP61PS8V+b2MD-6e9RZo zv6*|qiW?l;env6~iR6n;{65L$RM4X}O|N))drUUXlQ0QhIOlf#)2IKh8-Dh1GIlz< zfGtbR^jToA+}A0Nxe*iIhq5u`Styk0e94H}_=?#v=8Cnw?T2Hlnk-f>I-|an({jb4 z9t#EMSm{+7k6Wce0*`TA3~!2V6Io`n((;pn-QM6E zMQTy$Q~nCEBzC^@XO^YP)@AcgO4?nfMGa3|;`40TZF~9Iy~7ZvZq=&Jhj(A)EnCwEh4mtNEo@{wvUJBQj9~k;D^6AdaYUg7fn7 YK4Zf4Nt~M^>Hq)$07*qoM6N<$f=T;pw*UYD literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxhdpi/ic_videocam_off_black_24dp.png b/src/main/res/drawable-xxhdpi/ic_videocam_off_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..32d61d8dff7c7cb6eb0be698441b12190a4e3579 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXoKNz-Z^`;uuoF`1YK=7jvP=k&l`t zafc68%>VQ8{aUdiCT>-Zd77?oS~k30XJFREk$-YQ|3mSL`!C!1--L#i_UVf07T$B< ziP&-^(Rzt4$2OO!q>O%(c}goiRx5F??KZi|YWAXDWAc*hJMN`T%$Yj!z3>D9d z9+MVLRB=`I>~fpLD>8ZAhVRWKlNd!NhZ&ya5Ar}!bXD3jNH#;+^X!F(6Wo3r5Vk9w zwEXxt5B}wzT9<08m+X#Tl5TQA_gMZp?Q<7g%q7;!EHsUC@e2(N{mOdXZSn8ME4M>| P0m|U%>gTe~DWM4f4=9?R literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xxxhdpi/ic_videocam_off_black_24dp.png b/src/main/res/drawable-xxxhdpi/ic_videocam_off_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2a86702f8283cd3b8e7dc27c615f9ff51405fd78 GIT binary patch literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z}V*L;uuoF`1btGT&6;S=E8ha zjoc?1s^Q|AO5EOYK}=1@93EBN@nk;oV*U)#X@7hfAIk@MX)fKocd`3(n|hbTzH^mz zf=!2OoD62=d(2oIaIS@qyZ(?s(;|UsiW*!GwOjU!9g;P(m^bqrhrh+bS??N5)2`3l zzxzjxqN2#Q>k2tPf(;W{@3GIaUZke-=4Xw_EbS{xSnT5YCkX$jv32l!@cAo)W#jql z%ui4Rmoo?)dYsBMe?9vP&YFF43hEzzRyE8y@ccDn5lHX^LU3Ne?1n=QoNNq!8yEzd z7#jrS3O+FwG_f`a>oCkoV0^&B&7dB^U~!P?0H+v84OFTnfkC0AdQJ^gjYFa*#0Z4+ z0~US;b(8WPhEB!VS9Aq$%}#vnACXx9b)|JpvL}aHZ5uEQ>{|YdJC#o}U^v$zc)meA z(eK%8LAN~&4cduEv~ylxc+9(h8YnQQ)G=%~yr3j{vgs=@Vi-JK{an^LB{Ts53zn*T literal 0 HcmV?d00001