diff --git a/art/flip_camera_android-black-24dp.svg b/art/flip_camera_android-black-24dp.svg new file mode 100644 index 0000000000000000000000000000000000000000..f50c0d721e7efee0723a3602ea772d257c1027a8 --- /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 86a0ddf7913d87f1f66b10cb888224bc7e833b41..863a5cca3add8ee0ed7848b93b35a407afb6e330 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 bd8972598e7bb21d27f6b2b1863daf52976c88ad..33c7913e72a96fec2496c0d302a587fcca93b9c4 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 0000000000000000000000000000000000000000..49f8ffdf4a1f764a7590fe00c0537bfb5a35842f --- /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 98b5c9aa6ce59892f3ff3b46a86a89d0aef9689a..9aeac835bb4ecf3177d9d98aa51dbee5ecd010ac 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 17c1b77fef23b1732428d98104137b1d89ec21a4..844ef9db842de9db57142ed1791312ae6d02475a 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 Binary files a/src/main/res/drawable-hdpi/date_bubble_grey.9.png and b/src/main/res/drawable-hdpi/date_bubble_grey.9.png differ 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 Binary files a/src/main/res/drawable-hdpi/date_bubble_white.9.png and b/src/main/res/drawable-hdpi/date_bubble_white.9.png differ 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 Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_flip_camera_android_black_24dp.png differ diff --git a/src/main/res/drawable-hdpi/message_bubble_received.9.png b/src/main/res/drawable-hdpi/message_bubble_received.9.png index 4fb7faeb3620fb123fa1daf6cf5a6a463ddb5e0d..7f5319c8d38a426c70bccb1a55f17e5cb18dc2f4 100644 Binary files a/src/main/res/drawable-hdpi/message_bubble_received.9.png and b/src/main/res/drawable-hdpi/message_bubble_received.9.png differ diff --git a/src/main/res/drawable-hdpi/message_bubble_received_dark.9.png b/src/main/res/drawable-hdpi/message_bubble_received_dark.9.png index 9bb617fa55617c703e84f8ad1714c60930ac9827..0bb89223c89576e8ba3c51562a5b664f421b4bf8 100644 Binary files a/src/main/res/drawable-hdpi/message_bubble_received_dark.9.png and b/src/main/res/drawable-hdpi/message_bubble_received_dark.9.png differ 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 Binary files a/src/main/res/drawable-hdpi/message_bubble_received_grey.9.png and b/src/main/res/drawable-hdpi/message_bubble_received_grey.9.png differ diff --git a/src/main/res/drawable-hdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-hdpi/message_bubble_received_warning.9.png index 7130402e9e9d89fd91f14da66cd6e2eabc0b2e1e..8bdfcc79c8353a572f1c21f34166d80ff78b9c4f 100644 Binary files a/src/main/res/drawable-hdpi/message_bubble_received_warning.9.png and b/src/main/res/drawable-hdpi/message_bubble_received_warning.9.png differ 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 Binary files a/src/main/res/drawable-hdpi/message_bubble_received_white.9.png and b/src/main/res/drawable-hdpi/message_bubble_received_white.9.png differ 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 Binary files a/src/main/res/drawable-hdpi/message_bubble_sent.9.png and b/src/main/res/drawable-hdpi/message_bubble_sent.9.png differ diff --git a/src/main/res/drawable-hdpi/message_bubble_sent_grey.9.png b/src/main/res/drawable-hdpi/message_bubble_sent_grey.9.png index a2db7445c4b056d5ca5dd1663aca38df06dd9872..a0e998c002e6f5747c762d3105459c5700d88252 100644 Binary files a/src/main/res/drawable-hdpi/message_bubble_sent_grey.9.png and b/src/main/res/drawable-hdpi/message_bubble_sent_grey.9.png differ 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 Binary files a/src/main/res/drawable-mdpi/date_bubble_grey.9.png and b/src/main/res/drawable-mdpi/date_bubble_grey.9.png differ 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 Binary files a/src/main/res/drawable-mdpi/date_bubble_white.9.png and b/src/main/res/drawable-mdpi/date_bubble_white.9.png differ diff --git a/src/main/res/drawable-mdpi/ic_flip_camera_android_black_24dp.png b/src/main/res/drawable-mdpi/ic_flip_camera_android_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..79d201f4852c57656cd070ddd74e784188944dc8 Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_flip_camera_android_black_24dp.png differ diff --git a/src/main/res/drawable-mdpi/message_bubble_received.9.png b/src/main/res/drawable-mdpi/message_bubble_received.9.png index f5628441540bd7663ee9c576c497aebd25a42af8..3f31766ce87dd9c1517a17de676083ee6a8d17d2 100644 Binary files a/src/main/res/drawable-mdpi/message_bubble_received.9.png and b/src/main/res/drawable-mdpi/message_bubble_received.9.png differ diff --git a/src/main/res/drawable-mdpi/message_bubble_received_dark.9.png b/src/main/res/drawable-mdpi/message_bubble_received_dark.9.png index ecfb9f4275f7bb44d30fe2a2e317aef6afe7d000..d5c45ea9d1a6c41f5fca7253cadf7a796f32f5ac 100644 Binary files a/src/main/res/drawable-mdpi/message_bubble_received_dark.9.png and b/src/main/res/drawable-mdpi/message_bubble_received_dark.9.png differ 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 Binary files a/src/main/res/drawable-mdpi/message_bubble_received_grey.9.png and b/src/main/res/drawable-mdpi/message_bubble_received_grey.9.png differ 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 Binary files a/src/main/res/drawable-mdpi/message_bubble_received_warning.9.png and b/src/main/res/drawable-mdpi/message_bubble_received_warning.9.png differ 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 Binary files a/src/main/res/drawable-mdpi/message_bubble_received_white.9.png and b/src/main/res/drawable-mdpi/message_bubble_received_white.9.png differ 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 Binary files a/src/main/res/drawable-mdpi/message_bubble_sent.9.png and b/src/main/res/drawable-mdpi/message_bubble_sent.9.png differ 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 Binary files a/src/main/res/drawable-mdpi/message_bubble_sent_grey.9.png and b/src/main/res/drawable-mdpi/message_bubble_sent_grey.9.png differ 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 Binary files a/src/main/res/drawable-xhdpi/date_bubble_grey.9.png and b/src/main/res/drawable-xhdpi/date_bubble_grey.9.png differ 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 Binary files a/src/main/res/drawable-xhdpi/date_bubble_white.9.png and b/src/main/res/drawable-xhdpi/date_bubble_white.9.png differ 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 Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_flip_camera_android_black_24dp.png differ 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 Binary files a/src/main/res/drawable-xhdpi/message_bubble_received.9.png and b/src/main/res/drawable-xhdpi/message_bubble_received.9.png differ 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 Binary files a/src/main/res/drawable-xhdpi/message_bubble_received_dark.9.png and b/src/main/res/drawable-xhdpi/message_bubble_received_dark.9.png differ 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 Binary files a/src/main/res/drawable-xhdpi/message_bubble_received_grey.9.png and b/src/main/res/drawable-xhdpi/message_bubble_received_grey.9.png differ diff --git a/src/main/res/drawable-xhdpi/message_bubble_received_warning.9.png b/src/main/res/drawable-xhdpi/message_bubble_received_warning.9.png index ef2cc4fce3c250dcdad527a88cb9820dc39787f7..9b46f4656a69739e32e7de6c0fd1df11fd42ba78 100644 Binary files a/src/main/res/drawable-xhdpi/message_bubble_received_warning.9.png and b/src/main/res/drawable-xhdpi/message_bubble_received_warning.9.png differ 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 Binary files a/src/main/res/drawable-xhdpi/message_bubble_received_white.9.png and b/src/main/res/drawable-xhdpi/message_bubble_received_white.9.png differ 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 Binary files a/src/main/res/drawable-xhdpi/message_bubble_sent.9.png and b/src/main/res/drawable-xhdpi/message_bubble_sent.9.png differ diff --git a/src/main/res/drawable-xhdpi/message_bubble_sent_grey.9.png b/src/main/res/drawable-xhdpi/message_bubble_sent_grey.9.png index 5c28d1caa5f19a40655f060bdce6ce4b9f8ec3ba..85dd6223ca5c0018abbc39ce0b8d64f788fc8f08 100644 Binary files a/src/main/res/drawable-xhdpi/message_bubble_sent_grey.9.png and b/src/main/res/drawable-xhdpi/message_bubble_sent_grey.9.png differ 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 Binary files a/src/main/res/drawable-xxhdpi/date_bubble_grey.9.png and b/src/main/res/drawable-xxhdpi/date_bubble_grey.9.png differ 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 Binary files a/src/main/res/drawable-xxhdpi/date_bubble_white.9.png and b/src/main/res/drawable-xxhdpi/date_bubble_white.9.png differ 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 Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_flip_camera_android_black_24dp.png differ diff --git a/src/main/res/drawable-xxhdpi/message_bubble_received.9.png b/src/main/res/drawable-xxhdpi/message_bubble_received.9.png index 4670b8296d39a71c1664d5252ebac3682bb3112b..71b8c3f1ed17a13e90a58cf2f91836a93c1e721c 100644 Binary files a/src/main/res/drawable-xxhdpi/message_bubble_received.9.png and b/src/main/res/drawable-xxhdpi/message_bubble_received.9.png differ 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 Binary files a/src/main/res/drawable-xxhdpi/message_bubble_received_dark.9.png and b/src/main/res/drawable-xxhdpi/message_bubble_received_dark.9.png differ diff --git a/src/main/res/drawable-xxhdpi/message_bubble_received_grey.9.png b/src/main/res/drawable-xxhdpi/message_bubble_received_grey.9.png index 76bff006c2906192fa7ab00c4917e4df627a3fa9..348b7de5c22142d8a92ffd88d2778095cd8bff36 100644 Binary files a/src/main/res/drawable-xxhdpi/message_bubble_received_grey.9.png and b/src/main/res/drawable-xxhdpi/message_bubble_received_grey.9.png differ 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 Binary files a/src/main/res/drawable-xxhdpi/message_bubble_received_warning.9.png and b/src/main/res/drawable-xxhdpi/message_bubble_received_warning.9.png differ 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 Binary files a/src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png and b/src/main/res/drawable-xxhdpi/message_bubble_received_white.9.png differ diff --git a/src/main/res/drawable-xxhdpi/message_bubble_sent.9.png b/src/main/res/drawable-xxhdpi/message_bubble_sent.9.png index 521e027f68598b9ac1da285634e86b60cd62e226..17f85b64bb665ac7e851876ff0edbd188f770d60 100644 Binary files a/src/main/res/drawable-xxhdpi/message_bubble_sent.9.png and b/src/main/res/drawable-xxhdpi/message_bubble_sent.9.png differ diff --git a/src/main/res/drawable-xxhdpi/message_bubble_sent_grey.9.png b/src/main/res/drawable-xxhdpi/message_bubble_sent_grey.9.png index 822344041f40eb5adfd3fced2b3e83b9aa8cf560..585dcacc713df36ce976b2150468c64425b4ef40 100644 Binary files a/src/main/res/drawable-xxhdpi/message_bubble_sent_grey.9.png and b/src/main/res/drawable-xxhdpi/message_bubble_sent_grey.9.png differ 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 Binary files a/src/main/res/drawable-xxxhdpi/date_bubble_grey.9.png and b/src/main/res/drawable-xxxhdpi/date_bubble_grey.9.png differ 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 Binary files a/src/main/res/drawable-xxxhdpi/date_bubble_white.9.png and b/src/main/res/drawable-xxxhdpi/date_bubble_white.9.png differ 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 Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_flip_camera_android_black_24dp.png differ diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_received.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_received.9.png index eccc90077e5adce57468aca635363077dd0371f4..79689cb632f6d6cf131f336b70f10dea8c11173c 100644 Binary files a/src/main/res/drawable-xxxhdpi/message_bubble_received.9.png and b/src/main/res/drawable-xxxhdpi/message_bubble_received.9.png differ diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_received_dark.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_received_dark.9.png index fa3ca2035e20f6d09b2a5186ec1393b4bbc85a33..4ad74b6b2f55c8f4fb4fbd5dcb55166797c67abb 100644 Binary files a/src/main/res/drawable-xxxhdpi/message_bubble_received_dark.9.png and b/src/main/res/drawable-xxxhdpi/message_bubble_received_dark.9.png differ 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 Binary files a/src/main/res/drawable-xxxhdpi/message_bubble_received_grey.9.png and b/src/main/res/drawable-xxxhdpi/message_bubble_received_grey.9.png differ 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 Binary files a/src/main/res/drawable-xxxhdpi/message_bubble_received_warning.9.png and b/src/main/res/drawable-xxxhdpi/message_bubble_received_warning.9.png differ 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 Binary files a/src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png and b/src/main/res/drawable-xxxhdpi/message_bubble_received_white.9.png differ diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_sent.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_sent.9.png index 55fa4279865da03530ccfc7c0ff0e83762702fa9..2f3049fadf56560dbece216968ba4ce558872c1e 100644 Binary files a/src/main/res/drawable-xxxhdpi/message_bubble_sent.9.png and b/src/main/res/drawable-xxxhdpi/message_bubble_sent.9.png differ diff --git a/src/main/res/drawable-xxxhdpi/message_bubble_sent_grey.9.png b/src/main/res/drawable-xxxhdpi/message_bubble_sent_grey.9.png index af45346c4947cffed95ec3dc2d39b5cd21f98908..7939893ace76d49e124e1af849491cf9ac9ddd90 100644 Binary files a/src/main/res/drawable-xxxhdpi/message_bubble_sent_grey.9.png and b/src/main/res/drawable-xxxhdpi/message_bubble_sent_grey.9.png differ diff --git a/src/main/res/layout/activity_rtp_session.xml b/src/main/res/layout/activity_rtp_session.xml index 47bfa95ca368adb0706041f1c4fc8c0bdd6e5b35..13e0e5d2ede3cc59921e735ffd33ed2d3e7ae835 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 066ecf6125b19d22e75856b66bcf1af6c00bbe1d..c83db9dc35b18f8203106f55ee07569a4521b3e8 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