From 63ddd97b6b110e63e5087c5b24a82eed0a41ef39 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 2 May 2020 17:15:46 +0200 Subject: [PATCH] add button to switch cameras during video call RIP symmetry :-( fixes #3683 --- art/flip_camera_android-black-24dp.svg | 1 + art/render.rb | 1 + .../conversations/ui/RtpSessionActivity.java | 40 ++++++++-- .../ui/util/MainThreadExecutor.java | 37 +++++++++ .../xmpp/jingle/JingleRtpConnection.java | 10 +++ .../xmpp/jingle/WebRTCWrapper.java | 45 +++++++++-- .../res/drawable-hdpi/date_bubble_grey.9.png | Bin 657 -> 657 bytes .../res/drawable-hdpi/date_bubble_white.9.png | Bin 689 -> 689 bytes .../ic_flip_camera_android_black_24dp.png | Bin 0 -> 717 bytes .../message_bubble_received.9.png | Bin 772 -> 772 bytes .../message_bubble_received_dark.9.png | Bin 773 -> 773 bytes .../message_bubble_received_grey.9.png | Bin 750 -> 750 bytes .../message_bubble_received_warning.9.png | Bin 776 -> 776 bytes .../message_bubble_received_white.9.png | Bin 779 -> 779 bytes .../drawable-hdpi/message_bubble_sent.9.png | Bin 687 -> 687 bytes .../message_bubble_sent_grey.9.png | Bin 707 -> 707 bytes .../res/drawable-mdpi/date_bubble_grey.9.png | Bin 514 -> 514 bytes .../res/drawable-mdpi/date_bubble_white.9.png | Bin 525 -> 525 bytes .../ic_flip_camera_android_black_24dp.png | Bin 0 -> 472 bytes .../message_bubble_received.9.png | Bin 596 -> 596 bytes .../message_bubble_received_dark.9.png | Bin 617 -> 617 bytes .../message_bubble_received_grey.9.png | Bin 595 -> 595 bytes .../message_bubble_received_warning.9.png | Bin 599 -> 599 bytes .../message_bubble_received_white.9.png | Bin 610 -> 610 bytes .../drawable-mdpi/message_bubble_sent.9.png | Bin 558 -> 558 bytes .../message_bubble_sent_grey.9.png | Bin 568 -> 568 bytes .../res/drawable-xhdpi/date_bubble_grey.9.png | Bin 739 -> 739 bytes .../drawable-xhdpi/date_bubble_white.9.png | Bin 769 -> 769 bytes .../ic_flip_camera_android_black_24dp.png | Bin 0 -> 915 bytes .../message_bubble_received.9.png | Bin 936 -> 936 bytes .../message_bubble_received_dark.9.png | Bin 926 -> 926 bytes .../message_bubble_received_grey.9.png | Bin 915 -> 915 bytes .../message_bubble_received_warning.9.png | Bin 916 -> 916 bytes .../message_bubble_received_white.9.png | Bin 935 -> 935 bytes .../drawable-xhdpi/message_bubble_sent.9.png | Bin 857 -> 857 bytes .../message_bubble_sent_grey.9.png | Bin 842 -> 842 bytes .../drawable-xxhdpi/date_bubble_grey.9.png | Bin 1072 -> 1072 bytes .../drawable-xxhdpi/date_bubble_white.9.png | Bin 1127 -> 1127 bytes .../ic_flip_camera_android_black_24dp.png | Bin 0 -> 1340 bytes .../message_bubble_received.9.png | Bin 1319 -> 1319 bytes .../message_bubble_received_dark.9.png | Bin 1319 -> 1319 bytes .../message_bubble_received_grey.9.png | Bin 1301 -> 1301 bytes .../message_bubble_received_warning.9.png | Bin 1332 -> 1332 bytes .../message_bubble_received_white.9.png | Bin 1344 -> 1344 bytes .../drawable-xxhdpi/message_bubble_sent.9.png | Bin 1190 -> 1190 bytes .../message_bubble_sent_grey.9.png | Bin 1173 -> 1173 bytes .../drawable-xxxhdpi/date_bubble_grey.9.png | Bin 1392 -> 1392 bytes .../drawable-xxxhdpi/date_bubble_white.9.png | Bin 1430 -> 1430 bytes .../ic_flip_camera_android_black_24dp.png | Bin 0 -> 1780 bytes .../message_bubble_received.9.png | Bin 1713 -> 1713 bytes .../message_bubble_received_dark.9.png | Bin 1691 -> 1691 bytes .../message_bubble_received_grey.9.png | Bin 1670 -> 1670 bytes .../message_bubble_received_warning.9.png | Bin 1696 -> 1696 bytes .../message_bubble_received_white.9.png | Bin 1705 -> 1705 bytes .../message_bubble_sent.9.png | Bin 1499 -> 1499 bytes .../message_bubble_sent_grey.9.png | Bin 1468 -> 1468 bytes src/main/res/layout/activity_rtp_session.xml | 73 +++++++++++------- src/main/res/values/strings.xml | 1 + 58 files changed, 168 insertions(+), 40 deletions(-) create mode 100644 art/flip_camera_android-black-24dp.svg create mode 100644 src/main/java/eu/siacs/conversations/ui/util/MainThreadExecutor.java create mode 100644 src/main/res/drawable-hdpi/ic_flip_camera_android_black_24dp.png create mode 100644 src/main/res/drawable-mdpi/ic_flip_camera_android_black_24dp.png create mode 100644 src/main/res/drawable-xhdpi/ic_flip_camera_android_black_24dp.png create mode 100644 src/main/res/drawable-xxhdpi/ic_flip_camera_android_black_24dp.png create mode 100644 src/main/res/drawable-xxxhdpi/ic_flip_camera_android_black_24dp.png diff --git a/art/flip_camera_android-black-24dp.svg b/art/flip_camera_android-black-24dp.svg new file mode 100644 index 000000000..f50c0d721 --- /dev/null +++ b/art/flip_camera_android-black-24dp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/art/render.rb b/art/render.rb index 86a0ddf79..863a5cca3 100755 --- a/art/render.rb +++ b/art/render.rb @@ -27,6 +27,7 @@ images = { 'open_pdf_white.svg' => ['open_pdf_white', 128], 'conversations_mono.svg' => ['conversations/ic_notification', 24], 'quicksy_mono.svg' => ['quicksy/ic_notification', 24], + 'flip_camera_android-black-24dp.svg' => ['ic_flip_camera_android_black_24dp', 24], 'ic_send_text_offline.svg' => ['ic_send_text_offline', 36], 'ic_send_text_offline_white.svg' => ['ic_send_text_offline_white', 36], 'ic_send_text_online.svg' => ['ic_send_text_online', 36], diff --git a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java index bd8972598..33c7913e7 100644 --- a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java @@ -22,9 +22,14 @@ import android.widget.Toast; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import org.checkerframework.checker.nullness.compatqual.NullableDecl; import org.webrtc.SurfaceViewRenderer; import org.webrtc.VideoTrack; @@ -42,6 +47,7 @@ import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.services.AppRTCAudioManager; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.ui.util.AvatarWorkerTask; +import eu.siacs.conversations.ui.util.MainThreadExecutor; import eu.siacs.conversations.utils.PermissionUtils; import eu.siacs.conversations.xmpp.jingle.AbstractJingleConnection; import eu.siacs.conversations.xmpp.jingle.JingleRtpConnection; @@ -83,7 +89,6 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe @Override public void onCreate(Bundle savedInstanceState) { - Log.d(Config.LOGTAG, this.getClass().getName() + ".onCreate()"); super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD @@ -561,18 +566,21 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe if (state == RtpEndUserState.CONNECTED && !isPictureInPicture()) { Preconditions.checkArgument(media.size() > 0, "Media must not be empty"); if (media.contains(Media.VIDEO)) { - updateInCallButtonConfigurationVideo(requireRtpConnection().isVideoEnabled()); + final JingleRtpConnection rtpConnection = requireRtpConnection(); + updateInCallButtonConfigurationVideo(rtpConnection.isVideoEnabled(), rtpConnection.isCameraSwitchable()); } else { final AppRTCAudioManager audioManager = requireRtpConnection().getAudioManager(); updateInCallButtonConfigurationSpeaker( audioManager.getSelectedAudioDevice(), audioManager.getAudioDevices().size() ); + this.binding.inCallActionFarRight.setVisibility(View.GONE); } updateInCallButtonConfigurationMicrophone(requireRtpConnection().isMicrophoneEnabled()); } else { this.binding.inCallActionLeft.setVisibility(View.GONE); this.binding.inCallActionRight.setVisibility(View.GONE); + this.binding.inCallActionFarRight.setVisibility(View.GONE); } } @@ -612,8 +620,15 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe } @SuppressLint("RestrictedApi") - private void updateInCallButtonConfigurationVideo(final boolean videoEnabled) { + private void updateInCallButtonConfigurationVideo(final boolean videoEnabled, final boolean isCameraSwitchable) { this.binding.inCallActionRight.setVisibility(View.VISIBLE); + if (isCameraSwitchable) { + this.binding.inCallActionFarRight.setImageResource(R.drawable.ic_flip_camera_android_black_24dp); + this.binding.inCallActionFarRight.setVisibility(View.VISIBLE); + this.binding.inCallActionFarRight.setOnClickListener(this::switchCamera); + } else { + this.binding.inCallActionFarRight.setVisibility(View.GONE); + } if (videoEnabled) { this.binding.inCallActionRight.setImageResource(R.drawable.ic_videocam_black_24dp); this.binding.inCallActionRight.setOnClickListener(this::disableVideo); @@ -623,14 +638,29 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe } } + private void switchCamera(final View view) { + Futures.addCallback(requireRtpConnection().switchCamera(), new FutureCallback() { + @Override + public void onSuccess(@NullableDecl Void result) { + + } + + @Override + public void onFailure(final Throwable throwable) { + Log.d(Config.LOGTAG,"could not switch camera", Throwables.getRootCause(throwable)); + Toast.makeText(RtpSessionActivity.this, R.string.could_not_switch_camera, Toast.LENGTH_LONG).show(); + } + }, MainThreadExecutor.getInstance()); + } + private void enableVideo(View view) { requireRtpConnection().setVideoEnabled(true); - updateInCallButtonConfigurationVideo(true); + updateInCallButtonConfigurationVideo(true, requireRtpConnection().isCameraSwitchable()); } private void disableVideo(View view) { requireRtpConnection().setVideoEnabled(false); - updateInCallButtonConfigurationVideo(false); + updateInCallButtonConfigurationVideo(false, requireRtpConnection().isCameraSwitchable()); } diff --git a/src/main/java/eu/siacs/conversations/ui/util/MainThreadExecutor.java b/src/main/java/eu/siacs/conversations/ui/util/MainThreadExecutor.java new file mode 100644 index 000000000..49f8ffdf4 --- /dev/null +++ b/src/main/java/eu/siacs/conversations/ui/util/MainThreadExecutor.java @@ -0,0 +1,37 @@ +/* + * Copyright 2019 Daniel Gultsch + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package eu.siacs.conversations.ui.util; + +import android.os.Handler; +import android.os.Looper; + +import java.util.concurrent.Executor; + +public class MainThreadExecutor implements Executor { + + private static final MainThreadExecutor INSTANCE = new MainThreadExecutor(); + + private final Handler handler = new Handler(Looper.myLooper()); + + @Override + public void execute(final Runnable command) { + handler.post(command); + } + + public static MainThreadExecutor getInstance() { + return INSTANCE; + } +} 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 98b5c9aa6..9aeac835b 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java @@ -12,6 +12,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import com.google.common.primitives.Ints; +import com.google.common.util.concurrent.ListenableFuture; import org.webrtc.EglBase; import org.webrtc.IceCandidate; @@ -1037,6 +1038,15 @@ public class JingleRtpConnection extends AbstractJingleConnection implements Web return webRTCWrapper.isVideoEnabled(); } + + public boolean isCameraSwitchable() { + return webRTCWrapper.isCameraSwitchable(); + } + + public ListenableFuture switchCamera() { + return webRTCWrapper.switchCamera(); + } + public void setVideoEnabled(final boolean enabled) { webRTCWrapper.setVideoEnabled(enabled); } 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 17c1b77fe..844ef9db8 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java @@ -8,6 +8,8 @@ import android.util.Log; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; @@ -255,7 +257,7 @@ public class WebRTCWrapper { try { peerConnection.dispose(); } catch (final IllegalStateException e) { - Log.e(Config.LOGTAG,"unable to dispose of peer connection", e); + Log.e(Config.LOGTAG, "unable to dispose of peer connection", e); } } @@ -270,6 +272,31 @@ public class WebRTCWrapper { } } + boolean isCameraSwitchable() { + final CapturerChoice capturerChoice = this.capturerChoice; + return capturerChoice != null && capturerChoice.availableCameras.size() > 1; + } + + ListenableFuture switchCamera() { + final CapturerChoice capturerChoice = this.capturerChoice; + if (capturerChoice == null) { + return Futures.immediateFailedFuture(new IllegalStateException("CameraCapturer has not been initialized")); + } + final SettableFuture future = SettableFuture.create(); + capturerChoice.cameraVideoCapturer.switchCamera(new CameraVideoCapturer.CameraSwitchHandler() { + @Override + public void onCameraSwitchDone(boolean isFrontCamera) { + future.set(null); + } + + @Override + public void onCameraSwitchError(final String message) { + future.setException(new IllegalStateException(String.format("Unable to switch camera %s", message))); + } + }); + return future; + } + boolean isMicrophoneEnabled() { final AudioTrack audioTrack = this.localAudioTrack; if (audioTrack == null) { @@ -408,21 +435,21 @@ public class WebRTCWrapper { private Optional getVideoCapturer() { final CameraEnumerator enumerator = getCameraEnumerator(); - final String[] deviceNames = enumerator.getDeviceNames(); + final Set deviceNames = ImmutableSet.copyOf(enumerator.getDeviceNames()); for (final String deviceName : deviceNames) { if (enumerator.isFrontFacing(deviceName)) { - return Optional.fromNullable(of(enumerator, deviceName)); + return Optional.fromNullable(of(enumerator, deviceName, deviceNames)); } } - if (deviceNames.length == 0) { + if (deviceNames.size() == 0) { return Optional.absent(); } else { - return Optional.fromNullable(of(enumerator, deviceNames[0])); + return Optional.fromNullable(of(enumerator, Iterables.get(deviceNames, 0), deviceNames)); } } @Nullable - private static CapturerChoice of(CameraEnumerator enumerator, final String deviceName) { + private static CapturerChoice of(CameraEnumerator enumerator, final String deviceName, Set availableCameras) { final CameraVideoCapturer capturer = enumerator.createCapturer(deviceName, null); if (capturer == null) { return null; @@ -431,7 +458,7 @@ public class WebRTCWrapper { Collections.sort(choices, (a, b) -> b.width - a.width); for (final CameraEnumerationAndroid.CaptureFormat captureFormat : choices) { if (captureFormat.width <= CAPTURING_RESOLUTION) { - return new CapturerChoice(capturer, captureFormat); + return new CapturerChoice(capturer, captureFormat, availableCameras); } } return null; @@ -520,10 +547,12 @@ public class WebRTCWrapper { private static class CapturerChoice { private final CameraVideoCapturer cameraVideoCapturer; private final CameraEnumerationAndroid.CaptureFormat captureFormat; + private final Set availableCameras; - CapturerChoice(CameraVideoCapturer cameraVideoCapturer, CameraEnumerationAndroid.CaptureFormat captureFormat) { + CapturerChoice(CameraVideoCapturer cameraVideoCapturer, CameraEnumerationAndroid.CaptureFormat captureFormat, Set cameras) { this.cameraVideoCapturer = cameraVideoCapturer; this.captureFormat = captureFormat; + this.availableCameras = cameras; } int getFrameRate() { diff --git a/src/main/res/drawable-hdpi/date_bubble_grey.9.png b/src/main/res/drawable-hdpi/date_bubble_grey.9.png index eb64a1e22c3949b7b1e8f6d4e37133c90eadc99b..6236855a2d8db0ab3711dc150bc9040a1d2ff74c 100644 GIT binary patch delta 85 zcmbQpI+1lkFV_=RCO#pK_{c<+jniuxrHu@94NP?nj6w`etPCxz3@o$_46F`r0|p8>iPYN*h|}8XD;unuHjdS{WKznV4uB7+M(^JYSu$ Uda^!~7%ur~-!6zxPGB+w01e<5*Z=?k diff --git a/src/main/res/drawable-hdpi/date_bubble_white.9.png b/src/main/res/drawable-hdpi/date_bubble_white.9.png index 23789900d474dabd3a6566597d0dce63291b7eac..fbeac64931778e3a7cd6d49c01f46f7677f17ec7 100644 GIT binary patch delta 85 zcmdnUx{-B4FV_=RCO#qd^UrFwZk#@sQQF8r*T7WQz$nDf#LCdZ%D`OPz`)AD;QzlT Ug_Hf6#Bj;?Esi-mxq-Wn!#tU}$Avpu`iV TI@zB|43~Ux;JcZV8<-3M;MEp6 diff --git a/src/main/res/drawable-hdpi/ic_flip_camera_android_black_24dp.png b/src/main/res/drawable-hdpi/ic_flip_camera_android_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3e0e64d7b6ba7e93ace2eec37985f84101123d38 GIT binary patch literal 717 zcmV;;0y6!HP)_zT!e6vSWzpQCcCkN(IJTS*l^An4hPaOY(h7A{WN92wyk*1x zQxKt=T8VjDSCX+5Y0(8ZC{$CPnDixFso7?m+%ddLe$QiCFcLSHIV!g(=^b1{kApvY?DU0wb{h`K78>fF{^f9#1H8j#SGzl>@wK6ocGB(vVFtjo-@RrPC lV_;xVEpd$~Nl7e8waU#;$xN$cFfzcQ!OG>*uE|%J3;`AJ9XJ30 diff --git a/src/main/res/drawable-hdpi/message_bubble_received_grey.9.png b/src/main/res/drawable-hdpi/message_bubble_received_grey.9.png index 9b7ce26c3b7895a784dabf397765267d1fd64665..acba47c98fa54e003fe10f7696bd8792f30551ad 100644 GIT binary patch delta 102 zcmaFI`i^x%FV_=RCO#pCz^0dC8>io5^f5BfH89mRFbXj=u`;xsekrd2W+8Q{?1&64Cic`uV805eh?tLJE%k_kniBE`We@}rIhC8#1vnF3>G6VoI;U1U( delta 102 zcmeBR>tLJE%k_wdPk>vMZK2BZjnls{`WRa18XD;unuHjdS{WKz8JlYx7+M(^+-a-U mXJBAZEpd$~Nl7e8waU#;$xN$cFfzcQVeRe1lP6ziG6Vqdw;lul diff --git a/src/main/res/drawable-hdpi/message_bubble_received_white.9.png b/src/main/res/drawable-hdpi/message_bubble_received_white.9.png index 933f6a52e1f092aa91ca9009023d539deda314f0..ed8c0273ecd5b94c2672744a98dfff5033284b3d 100644 GIT binary patch delta 102 zcmeBX>t>tK%k_kniBE|6ME8z08>fF~^f5BfH89mRFbXj=u`;xrIhN?Fe_a@(BG6VoESssG` delta 102 zcmeBX>t>tK%k_wdPk>u({)*Drjnls~`WRa18XD;unuHjdS{WKz8Cz%@7+M(^Xr1Fe m#=yX!TH+c}l9E`GYL%Oxl9^V?U}S(pL-gd$Rg-Tq83F(V79Df| diff --git a/src/main/res/drawable-hdpi/message_bubble_sent.9.png b/src/main/res/drawable-hdpi/message_bubble_sent.9.png index 1bcd6e0d7bea9a29653b2e4f02fa83721599d838..487a8f79a9494f0eca563305ba6e4ab6e10aa54d 100644 GIT binary patch delta 102 zcmZ3_x}J4HFV_=RCO#pSu=l$B8>i1^^f5BfH89mRFbXj=u`;xg>lls2@`H8j#SGzl>@wK6ocGBMOPFtjo-*gDyr UXL2Hw7%urE=l*Y)Jc-E=0Qp@Q3;+NC diff --git a/src/main/res/drawable-mdpi/date_bubble_grey.9.png b/src/main/res/drawable-mdpi/date_bubble_grey.9.png index 0a0ebb220ea0dc9f2229e2f0706f3fbf9561cca4..52d4daae890489eedbd5b7dec7a949738fab5f20 100644 GIT binary patch delta 84 zcmZo-X=0hs%k_kniBE_lJ~B~d;`DdYMh3bDrn&}3A%-Sah89)^7TN{|Rt5%~+osHz Syns;*mwd%*9hJ!!84Ur%+7_As delta 84 zcmZo-X=0hs%k_wdPk>vezIKlD#Od#(4J~vHjdTr7LJUo<3=OSJOtcLQtqcsFug+LK Tc>$vsF8OKSE{IRQ$Y=-vApIEV diff --git a/src/main/res/drawable-mdpi/date_bubble_white.9.png b/src/main/res/drawable-mdpi/date_bubble_white.9.png index 40f26d3996acbe48e6d0f4a6db07c47ce3bc74d5..8f8e060102958233a1a3bec477e672e4669739ef 100644 GIT binary patch delta 101 zcmeBW>1CPF%k_kniBE|A{Ii;^6Q}?5F*49KFx53M3NbXXGPJNVFxNIPure_C|L;j5 l0|SFRc?MtW?ChKkpT`3eT!qxPQJrv2mpO$AF==d delta 101 zcmeBW>1CPF%k_wdPk>wdp(N*niPL}j7+UBW8tEFEgczDy85&xd7;76CS{WE9@r0=| kFfgc=xJHzuB$lLF<>sekrd2W+8Q{6P)d|U~54l@iP`xooSQNQ!Q3bQt9rhd(Ww^TlZf6JNht#Q(WK)FSy1D7E%2z z`6TYp>@sdKmqM61z&<|X_Z3z#fe{R06!rL5nco2_DFWN^`Gz(06!=u4&}&Ylt3XCR zS!CRXT25p>MPQ=@d4}cad*g?|{}jYj^x`u5EM${K=bOg>_V5tLF8bSSK5!V{XG?61 zNZ$TuJ7r0V@Yq4%F~u?Uh&sjM<1Yn{66XqWChT;j!`grl*!wtkw1S*``dCk zkt|R}BQDlU2xQpoCO}B@rjYiv668~OPZ1y#tW2b?_#*URJx9KkB2dYRG==nE#yEyC zh%uqkUPqfxt;9<%F>^vQ>DF)>${pu7^a+LQSZF-YLfbr#bJNl0AL9!El#2Rcm^Oa^ O0000rIhJy^1XD2H&83F(v@wK6ocGB(mSFtjo-=-U_4 m!N9fdd`WPAL8kp)D7=;*`SQ%Pa85n9C7+4t?%+b5( l&A`B*TH+c}l9E`GYL%Oxl9^V?U}S(p!`tG_?~^T<3;_ck9ZCQI delta 102 zcmaFK@{(mjFV`a;J^^m!_lFuUZJZv;=woQ1YiOivXcA&*YGr6>Wo)W#U}$Av;4PWO l#=yX!TH+c}l9E`GYL%Oxl9^V?U}S(pgO$srU6U=C3;{0S9K-+s diff --git a/src/main/res/drawable-mdpi/message_bubble_received_grey.9.png b/src/main/res/drawable-mdpi/message_bubble_received_grey.9.png index f2d79acee4c6240d86079c3e6576b638e0b0190e..3e5e62c5e7dc4d3912829e807ab5cb1df43c84a7 100644 GIT binary patch delta 85 zcmcc2a+zg9FV_=RCO$#y(@TOsZk%qWo)c%U}$Avpm8$Z UX7WcyFWC;$Ke diff --git a/src/main/res/drawable-mdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-mdpi/message_bubble_received_warning.9.png index 2a81873ff4a9466d8980551567a307e126c32f49..66862dbe5b5b782569d79a95451fd38ba7048a05 100644 GIT binary patch delta 102 zcmcc4a-C&DFV_=RCO#pi{XHF48>c%n`WPAL8kp)D7=;*`SQ%Pa85n6B7+4t?tUY%6 m8Uq7^YKdz^NlIc#s#R`&N@iLmgOLFa4R>Z2XH8aPG6VoKF&)qV delta 102 zcmcc4a-C&DFV`a;J^^l(!et_b8>c%n`WRa18XD;unuHjdS{WKz8JlSv7+M(^RDCR% l&A`B*TH+c}l9E`GYL%Oxl9^V?U}S(p1NWK}>XX%&3<3Dx98~}S diff --git a/src/main/res/drawable-mdpi/message_bubble_received_white.9.png b/src/main/res/drawable-mdpi/message_bubble_received_white.9.png index 5e9cb12a64da81cf2e0d0a0eb777bd425c9d22cf..e8d69cc3f0cf669edb73b6389ef87f07093b997e 100644 GIT binary patch delta 84 zcmaFF@`z@wK6ocGPck*Ftjo-&^pI` TY!Z_gF6rpWo2w=pG8qB@3j`MQ diff --git a/src/main/res/drawable-mdpi/message_bubble_sent.9.png b/src/main/res/drawable-mdpi/message_bubble_sent.9.png index b7cc611fadfbe37d406502cb53b450c075023e19..f7c63c8f77a6323e91f798f9a57d1659fbf4e6f9 100644 GIT binary patch delta 102 zcmZ3-vW{g!FV_=RCO#pSu=l$B8>dS#`WPAL8kp)D7=;*`SQ%Pa8JK7r7+4t?oD=)^ mhJk@WwZt`|BqgyV)hahXB{Qv(!N>rIhW*}d0h9kS8Ug^tL>#LC delta 102 zcmZ3-vW{g!FV`a;J^^lx3W12IjnkzVeGDyh4UKdSO+pM!tqcvVOboOQ46O_dgrE5A lU|?WSEpd$~Nl7e8waU#;$xN$cFfzcQA!+9qmdSq^4FQwn96A61 diff --git a/src/main/res/drawable-mdpi/message_bubble_sent_grey.9.png b/src/main/res/drawable-mdpi/message_bubble_sent_grey.9.png index 57819cbae9b1554ed075a7f8c7c0ff47d6b5f137..e1a0bfe646c8d047f84dd72500a4a41a3cb2e42f 100644 GIT binary patch delta 102 zcmdnNvV&zpFV_=RCO#on#TT+OH%?b!^f5BfH89mRFbXj=u`;xg!<`WRa18XD;unuHjdS{WKznHXvt7+M(^Y@O`R m!@$6xTH+c}l9E`GYL%Oxl9^V?U}S(p!;y3UH%w+{G6VpcvK&+Z diff --git a/src/main/res/drawable-xhdpi/date_bubble_grey.9.png b/src/main/res/drawable-xhdpi/date_bubble_grey.9.png index 4c06bdf802ff72fc16d926107f9f9bbabe35006e..63225157d5fb3994921165d5a2c8a2774be53da8 100644 GIT binary patch delta 85 zcmaFN`j~Y>FV_=RCO#pK_{c<+jnmIFN*fvI8kp)D7=;*`SQ%Pa8CYl=7+4t?aBiD2 UV{#*t7%usW*E%YbH!&Fk00FV`a;J^^lBj;b|RH%>p#C~at=YiOivXcA&*YGr6>Wn!vrU}$Av;CLrl UesUv|7%q8(#@mZ0Z(=e807M)ZQvd(} diff --git a/src/main/res/drawable-xhdpi/date_bubble_white.9.png b/src/main/res/drawable-xhdpi/date_bubble_white.9.png index 2a96b9bfb698a509b1a914d4e8f927179d5c0a1e..c5eaa5e0b09cbe6703d1c39c4ecc5743b2c76a65 100644 GIT binary patch delta 85 zcmZohczlr}QZH89mRFbXj=u`;xwdp(N*njnm&UN*h|}8XD;unuHjdS{WKznHXyu7+M(^DDi}; TPM*&shD$y;@ZHSG7nlqI;(Hd$ diff --git a/src/main/res/drawable-xhdpi/ic_flip_camera_android_black_24dp.png b/src/main/res/drawable-xhdpi/ic_flip_camera_android_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..7178728e379b13a074bc70d687095390340419e5 GIT binary patch literal 915 zcmV;E18n?>P)K~!jg?b*+Z97Pld@Q>NVS$`za%?d^nf(K7t#K^LmOD-W^ zJ@_{W@khj)A_iT8LeNP38^k~qT*)nm+!BL_CgkYID`f4 z#4PT`9xUQjEQ>i&bx`G#Re?p9{cnv=d@cF42uq*;*aJu6CI^M$F zqXz2QF5zZ{|5MnKL%>HB?^eWenG1WdS`p{iD9(mWwo7<)Y|8!EgC9z&UNa zhkOq^#cEWH`77pAoD3p=LwxGCv9BAe82h~x2ZIE>o0Vogj+A0wlaT0A6HpttPwbtF zah94I{}%+nOQkrMv8jpSxB_NzSnM{hciUGY3wII(%<122Ew(LS7rw3O`%Sk`Q!JP4 z-$<}c#;khsMG+}qVq!R~`B!`84soo-1ferM-?}_oGFZoh2_iaToj)&D zn>C!n%c@5{yMRsl3sr{_1f(Ln0HWGfG`cFbxNV>n0rUD3(~+F4hhWK=0^t3U;SDiA z+Qx$FGE1_6d2ygF8ehS~8OfHhTmPYcWC8G;Nc%+x--{ARZtNBrI?Eg=;)4n&t9WW` z%D3^f>Jt6&ig(G_g3l@(-4v5;oUGarcLe1!N-u%V?eI<_VF+a?a} zmk0R#-0gwMB7hi;6Z+>wudU%raWZ=bkBQRyJ!1Q?C^GaZ{58PGhN#6BE7REo^l;Gd zm130k8=lWWunFeyp|n%jp!T;I^#>+JzKA(72}il)TfsZV%quysSr@Rs`+Qvd_gnD~ p{t)+Sm&BI(O!qm(6jO|ee*r-rMWZ0-*D3%2002ovPDHLkV1gsDrPu%f literal 0 HcmV?d00001 diff --git a/src/main/res/drawable-xhdpi/message_bubble_received.9.png b/src/main/res/drawable-xhdpi/message_bubble_received.9.png index e479bfb399c9ba3e0902916829bc425c519d898f..799c2e532a7604f9dd10bb677bae2611ebd47805 100644 GIT binary patch delta 102 zcmZ3%zJh&1FV_=RCO$#y(@TOsZk#@a$;Ze**T7WQz$nDf#LCdz%G6TZz`)ADKuqh@ mQ3eJE)e_f;l9a@fRIA+ll+3hB1|tI;8q&*)DkqmS8v+0?4IMxL delta 102 zcmZ3%zJh&1FV`a;J^^lpveOqbHcp?yWo)EvU}$Av(6=w7 mgMooTwZt`|BqgyV)hahXB{Qv(!N>rIhX0S>m`pBbHUt1O=^lUp diff --git a/src/main/res/drawable-xhdpi/message_bubble_received_dark.9.png b/src/main/res/drawable-xhdpi/message_bubble_received_dark.9.png index 6ab302b2c87920f11cf288a931711fc20c1addab..26523a2a551fd9e851c354334d2954fd3b02a636 100644 GIT binary patch delta 102 zcmbQoK97AuFV_=RCO#oXwbq*r8>e?M`4}1K8kp)D7=;*`SQ%Pa85n9C7+4t?%+b5( l&A`B*TH+c}l9E`GYL%Oxl9^V?U}S(p!`tG_?~`+x4FTL+9VP$( delta 102 zcmbQoK97AuFV`a;J^^l(!et_b8>e?M`50R08XD;unuHjdS{WKz8JlSv7+M(^RDCR% l&A`B*TH+c}l9E`GYL%Oxl9^V?U}S(p1NWK}>XUPs4FTqB9C-i$ diff --git a/src/main/res/drawable-xhdpi/message_bubble_received_grey.9.png b/src/main/res/drawable-xhdpi/message_bubble_received_grey.9.png index 03d423b87af909fe4f05116d80a3883ed2d17f25..2acae4964611e408b465f820f4dcf672bb541b1b 100644 GIT binary patch delta 85 zcmbQtKAC+&FV_=RCO#pCz^0dC8>iPZNgEmH8kp)D7=;*`SQ%Pa85n3A7ywDD$Xov> S8#0UGlJ{mwa-N*TYzP46OBLDx delta 85 zcmbQtKAC+&FV`a;J^^l}8Ams|Y@A-tByDJ+YiOivXcA&*YGr6>Wo)8tU}$Av@HQ`T U(_}+tFcrg`4}1K8kp)D7=;*`SQ%Pa85n6B7+4t?tUY%6 m8Uq7^YKdz^NlIc#s#R`&N@iLmgOLFa4R>Z2XH8CKHUt0_eI3jI delta 102 zcmbQjK81ZkFV`a;J^^l3wuLIsH%@P0@-ei~H8j#SGzl>@wK6ocGB(#XFtjo-xYJgx m&%nT-TH+c}l9E`GYL%Oxl9^V?U}S(p!`j=2Cr?ghHUt3FQyn+} diff --git a/src/main/res/drawable-xhdpi/message_bubble_received_white.9.png b/src/main/res/drawable-xhdpi/message_bubble_received_white.9.png index 4404bcfd4e6c527ccd8db6d24720bf1b7f58feb7..a735ad8749c6fc03c82f38b897d7268e86a29553 100644 GIT binary patch delta 102 zcmZ3^zMOqRFV_=RCO#qN6Wu%3Y@9xs$;Ze**T7WQz$nDf#LCdZ%D`CLz`)ADfP3SC mBnAcs)e_f;l9a@fRIA+ll+3hB1|tI;8mit@+?!m+YzP1%^&R&B delta 102 zcmZ3^zMOqRFV`a;J^^m^7wcV5Z=61v$;Z$_*U(7U&?Lmr)XLD%%Ggrdz|hLTpl2sT m5d#B*YKdz^NlIc#s#R`&N@iLmgOLFa4S%2PI5)YB*$@CQ_8zkU diff --git a/src/main/res/drawable-xhdpi/message_bubble_sent.9.png b/src/main/res/drawable-xhdpi/message_bubble_sent.9.png index 5db6951e1ecfa4bfa82af2af039095f0abc75fa1..aa7a6d1fdf38309a2abea4a64539977e90ca0119 100644 GIT binary patch delta 102 zcmcb~c9U&FFV_=RCO#on#TT+OH%@nD@-Z^dH89mRFbXj=u`;xQW@-Z^dH89mRFbXj=u`;xrI28}D>m6Iiz4FLym9HRgL delta 102 zcmX@bc8YC6FV`a;J^^m6X>yij8>gEw`50R08XD;unuHjdS{WKznHXss7+M(^v{c7V lWME)WEpd$~Nl7e8waU#;$xN$cFfzcQ;j7wH-N};7h5*1_8|(l8 diff --git a/src/main/res/drawable-xxhdpi/date_bubble_grey.9.png b/src/main/res/drawable-xxhdpi/date_bubble_grey.9.png index b7e9b500ea3c7be3c5d18f1a94f5a5ac7f8d0916..085665b8b3a37c626b9de8b0043a93e89b411ace 100644 GIT binary patch delta 85 zcmdnMv4LYkFV_=RCO#ofjkv%~8>h=KOB)&J8kp)D7=;*`SQ%Pa8CYr?7+4t?tUowk UXYx5_F@wK6ocGBMRQFtjo-aJ-W& UKlvQ97%q8(#@mZ0|7SJ?00M*;-T(jq diff --git a/src/main/res/drawable-xxhdpi/date_bubble_white.9.png b/src/main/res/drawable-xxhdpi/date_bubble_white.9.png index 82d25540ee36540583c3d239b2d5ddd21689f2fd..54b885fbe3e8ff7ed90cde7e17056b8d6da211a6 100644 GIT binary patch delta 102 zcmaFP@tk8qFV_=RCO#qd^UrFwZk!&>>|@wK6ocGBMURFtjo-P~r(w lWnf@XEpd$~Nl7e8waU#;$xN$cFfzcQAvo~e%*kdfh5*Ms8>0XK diff --git a/src/main/res/drawable-xxhdpi/ic_flip_camera_android_black_24dp.png b/src/main/res/drawable-xxhdpi/ic_flip_camera_android_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8b1511ccf329e29a8251eb36ad2b40aa18f01f GIT binary patch literal 1340 zcmV-C1;hG@P)@~8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11i48>K~#90?c3XnRb?2*@lP{~k;l|fv6~{zZtAAP7~%|uERCB8jCQi_5JA>#0ZY#XY9vb z>}<7>`XyJ-rMM59aRO%xw$s>#hgvbmJ&W-cPAP6mC$rwe%G#bLB18B>d{ffeFqYNw zWF?u0^*EzGbK2X7dU)vFj-#3}roA1-nph9jX%#!0^D`6ilrVATT@`=BSJ;hRt$!bF zwUfe%HVc>GD%^k-LJ!T$i+EUA6e=O@FVxOteA?l6+uIRg_$|jk0X+kPQP0cYQ@03a zS3;ISGw@{&k%#d(rbg5@S?C?V=g9vpW=G8ZFP#jUif=N6ox!sz{0p{ptd+fu*jSj7NWoUaYX2K#%>>HRAQ$&|c zz{Uh!?d`5u$+|V?bv82{C)A5I7 zZSR%|e7+b2k4e^c8gq*VJ)aDkioYc5yT8*1i=3)svl<(Oi}~ZNwx{*ISPQ_2u!&9L zj-o-U?m<^#M~=^L$HJly(ZrUxhGn`l>9F+c(XvDKTlD8G=p;`=po^_DMR{$zIBL z`R`~{i$QRSQ0AXCwh!VF1q%dHn1(0iyE56~|J#t-4AM%R_lEFKVg4FYY_%H{PWP|0 zV&%!X85fO-)0IIn>Y67BL+RcwK66lbHDIT3wQ)eGyciMYxS7JFJ0I5yF98q9U*CKd zPvZ&Uus!x?NmO3ry+*OC)Y$D1ZmalN3o{3=X~vk*R_-WO^i{J|zUr}9ZM!fG#~nB0 z9o4)Reo}ZpWLz3Emic%YhbEtU=(6#Vr6Jm5Y^ delta 102 zcmZ3^wVZ20FV`a;J^^k;#xoE8ZJaL5;$vu`YiOivXcA&*YGr6>Wo)c%U}$Avpm8$Z mhJk@WwZt`|BqgyV)hahXB{Qv(!N>rIhR7+;8zz5aF$4hh>>Y3b diff --git a/src/main/res/drawable-xxhdpi/message_bubble_received_dark.9.png b/src/main/res/drawable-xxhdpi/message_bubble_received_dark.9.png index 415fd157386c3062380471a7800d9c0f9c739107..cd7d570e5f303bfb77944fbb809e1a2b67cd2edb 100644 GIT binary patch delta 102 zcmZ3^wVZ20FV_=RCO#oXwbq*r8>b7i_!t@J8kp)D7=;*`SQ%Pa85n9C7+4t?%+b5( m&A`B*TH+c}l9E`GYL%Oxl9^V?U}S(p!`tG_?~}i=7yb7i_!wH~8XD;unuHjdS{WKz8JlSv7+M(^RDCR% m&A`B*TH+c}l9E`GYL%Oxl9^V?U}S(p1NWK}>XW~*7ycg}_!t@J8kp)D7=;*`SQ%Pa85n3A7ywDD$Xovz k7#LJbTq8;$vu`YiOivXcA&*YGr6>Wo)8tU}$Av@HQ`T m69WT-YKdz^NlIc#s#R`&N@iLmgOLFa4Refd@=boiVh8~AAsrR~ diff --git a/src/main/res/drawable-xxhdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-xxhdpi/message_bubble_received_warning.9.png index e24a829bed3d8b40eb66671c0b435cacd03fe8d2..2ff0fbaf203644a01c713b3199dd55c75dc6c4ae 100644 GIT binary patch delta 102 zcmdnOwS{X!FV_=RCO#pi{XHF48>cI<_!t@J8kp)D7=;*`SQ%Pa85n6B7+4t?tUY%6 m8Uq7^YKdz^NlIc#s#R`&N@iLmgOLFa4R>Z2XH8~iH3R?=eH~T+ delta 102 zcmdnOwS{X!FV`a;J^^mE`726eH%?bz@iDZ}H8j#SGzl>@wK6ocGPck*Ftjo-&^pI` mjDdkcwZt`|BqgyV)hahXB{Qv(!N>rIhUm$gt0ptE8Ug^|LmVam diff --git a/src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png b/src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png index 16548c294d667dbe2a2b6821ae3d644d2ea01e58..59925addb0e91bbedcd3f811fbd66110eb35ea85 100644 GIT binary patch delta 85 zcmX@Wb%1L^FV_=RCO#pSu=l$B8>j2ANE;dG8kp)D7=;*`SQ%Pa8JK7r7+4t?oD=)^ UX7W82FWo)T!U}$Av(6f`F UX!1Q4F|rI21y&=CzDHA3<1-Y90>pb delta 102 zcmZ3+xr}o{FV`a;J^^k`e({Vm8>dfV_A#{3H8j#SGzl>@wK6ocGBMOPFtjo-*gDyr mhk=1XwZt`|BqgyV)hahXB{Qv(!N>rIh9l?xZrI28}D>m6KCg3<3FV9M=E< delta 102 zcmbQrIhAulFV`a;J^^m6X>yij8>cri`xsj28XD;unuHjdS{WKznHXss7+M(^v{c7V lWME)WEpd$~Nl7e8waU#;$xN$cFfzcQ;j7wH-N`8|h5)i@93TJy diff --git a/src/main/res/drawable-xxxhdpi/date_bubble_grey.9.png b/src/main/res/drawable-xxxhdpi/date_bubble_grey.9.png index 2eda42882df7f2f1593c82fd09f02f76f13dc645..550fe2286612f0921904be281324749b14029b97 100644 GIT binary patch delta 85 zcmeys^?_?bFV_=RCO#ofjkv%~8>h#xNE;dG8kp)D7=;*`SQ%Pa8CYr?7+4t?tUowk UXEGnF7%usHbJQnHwr4d201I0e6#xJL delta 85 zcmeys^?_?bFV`a;J^^lBj;b|RH%^aXkv6o@H8j#SGzl>@wK6ocGBMRQFtjo-aJ-W& TKbenJ441q?0B3TzF diff --git a/src/main/res/drawable-xxxhdpi/date_bubble_white.9.png b/src/main/res/drawable-xxxhdpi/date_bubble_white.9.png index dfc24fadcf4a25013e80be605c98547c20b51b9e..6f75ed33c1aa74e3a1158d7b852e42f2e93a1411 100644 GIT binary patch delta 102 zcmbQnJ&k)pFV_=RCO#pK_{c<+jnkW0e2ffq4NP?nj6w`etPCxz3@o$_46F`r0|p8>ct1_!wH~8XD;unuHjdS{WKznV4uB7+M(^JYSu$ mnt_2qwZt`|BqgyV)hahXB{Qv(!N>rIhH2j}h)+&sH3R?(DjlW( diff --git a/src/main/res/drawable-xxxhdpi/ic_flip_camera_android_black_24dp.png b/src/main/res/drawable-xxxhdpi/ic_flip_camera_android_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..dd276a971ec30a8fc199f1fe9b9af814d287a554 GIT binary patch literal 1780 zcmVk8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H1260J5K~#90?VW3gRaF##ztM55F|{$vbRL-0kL*n){U|U}$buZx zK#8fJ1*K^Zsz3HHq9A{0EE!YJn-h1;B;Cj7TP@&<(H}csSDI1l5%?6m`H3jqjF|Hefk0o%BP+ zi-AXx30YEmb^;Sp+L4&J0XPr%O5=NjsJL-hUFfz0ZyqcY^B7)Gx` z0_H1K$cRZdC9TZDs5m*job)5>KY5`A=ta-Bg|>|`(fNyP8)<=sKp$%VjsfS}G$d^R zmf1AUGIybujyBsgB2DM7vT0aGtU%9KYpbY9JAWIp#h7=hkSko}?{~;1lW~%C{vTM* ziy2dg-aKK64dqD!aHkDJ95WlW-yOi2rWMES{H>-9@Q4kl{lCYw(lj?=9mx~*$oZp6 z{HoI0=q4w)GQ_6e@Km&5NQ)g|aANT;6n$%%UzEs%pswqXT18_U)k;hQd zjonS3ClvZyO(}92fMujRA>9uwP33)gRB5Py+^}=YJfs8D2Dm^52dsu0jU-DumC{jt zrXJ*+cQBvo-ptg49Mgo}XeX}p;o*T>A2-OGv9pgb5}0eD-BkD(fH@Z1zSUyeiSRK1 zHjn;Iv)J~qLAB78b~NM_KK=r1QgCg+V0;X~Zx-7=Y_aV`_!xj6EVg~XV%v%EF#y{w zw!O__+rx%N>`cUZ@o*yMD{o;w0BbV!Am=n-b~xIF+b3~yNi$}aqx&(qJ?Mgos5eDy zJ=wUFbV1O0F2UBMuP8>?t5CAsl%gSMCRsY_Lhs7YMF3VSl@n(icVbqbx(RVNI0Yw&QDqmsC zfDCyZk8Z-HY|&6&K&s>Bl}AX|`Bnp;hc zvNJBJM@kmE?o?fQpY$(&@RE7N8>(h4U*p&O#0oXQ{m7Frt~sxA8M9ks|o zDwnUd+J#hj%%lpsuT&vF`*mb21i$<@I=0&DZ%D zRl#`RI%GmNEt087`WlBUh>b#iIsYOjHjV(_A~)1l;2Y!xL4iOZ5C{YUfj}VO1^)vr WLzXvuo-u#`0000hFk`WPAL8kp)D7=;*`SQ%Pa85n9C7+4t?%+b5( l&A`B*TH+c}l9E`GYL%Oxl9^V?U}S(p!`tG_?~}9G3<2J!9V`F< delta 102 zcmbQuJDYbxFV`a;J^^l(!et_b8>hFk`WRa18XD;unuHjdS{WKz8JlSv7+M(^RDCR% l&A`B*TH+c}l9E`GYL%Oxl9^V?U}S(p1NWK}>XWnB3<2o39De`+ diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_received_grey.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_received_grey.9.png index acfa862d669616de94256a2991f56512c8babccd..3d0dd4734fd9b320d9e4ba622149f55ff8091dc6 100644 GIT binary patch delta 102 zcmZqUZR4HL%k_kniBE_ju<51P#_2_@K1K$*2Bx|OMj?hKR)!W<1_s&&20+p(^45O_ k1_sp<*NBpo#FA92-29Zxv`Pje0~{K>S(2P5hq4(00L9ZAT>t<8 delta 102 zcmZqUZR4HL%k_wdPk>wb{h`K78>bhs`WRa18XD;unuHjdS{WKz8JlVw7+M(^cuQun lF)%QwmbgZgq$HN4TIJ@aWTsUz7#ZNuVC8aY*W^$(Ljdy098v%P diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_received_warning.9.png index 555719ee61cd1efeb1752795304af41b63ca0f5f..0885149b352de1dcd2ef5bb1b36a370f5207bb0b 100644 GIT binary patch delta 85 zcmZ3$yMT8>FV_=RCO#qN6Wu%3Y@FW1Ds5z-YhbEtU=(6#Vr6JyWniprU|?lnz`gN6 U(qua}FFV`a;J^^mE`726eH%{+il{U1{H8j#SGzl>@wK6ocGPck*Ftjo-&^pI` UY_c7j7%utf$(ySt=d&3C01tH+NdN!< diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png index 9758293a717c8b62ceced94c803aa96a7707e683..25511916aefa1f1b59c7d45c913a881ba5b83306 100644 GIT binary patch delta 102 zcmZ3dfY^)WKgH89mRFbXj=u`;xp!;$vi>YhbEtU=(6#Vr6JyWnijpU|?lnkdgQ` mf`NfSwZt`|BqgyV)hahXB{Qv(!N>rI21y&=CzDsP8Ug?jDIDVf delta 102 zcmcc3eVcniFV`a;J^^k`e({Vm8>b&<@iDZ}H8j#SGzl>@wK6ocGBMOPFtjo-*gDyr mhk=1XwZt`|BqgyV)hahXB{Qv(!N>rIh9l?xZYhbEtU=(6#Vr6JyWniXlU|?ln5ZU?u mC<6n7YKdz^NlIc#s#R`&N@iLmgOLFa4H{R%D<^le8Ug?(KplAi delta 102 zcmdnPy@z{3FV`a;J^^m6X>yij8>g>e@iDZ}H8j#SGzl>@wK6ocGBMINFtjo-XsM2! l$iTp$TH+c}l9E`GYL%Oxl9^V?U}S(p!&kMZx|6$E4FTXS9Krwq diff --git a/src/main/res/layout/activity_rtp_session.xml b/src/main/res/layout/activity_rtp_session.xml index 47bfa95ca..13e0e5d2e 100644 --- a/src/main/res/layout/activity_rtp_session.xml +++ b/src/main/res/layout/activity_rtp_session.xml @@ -117,34 +117,56 @@ - + android:layout_centerInParent="true"> + + + + + + - + app:fabSize="mini" + app:tint="?attr/icon_tint" /> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 066ecf612..c83db9dc3 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -920,6 +920,7 @@ Your microphone is unavailable You can only have one call at a time. Return to ongoing call + Could not switch camera View %1$d Participant View %1$d Participants