diff --git a/app/src/main/java/org/thoughtcrime/securesms/audio/AudioRecordingHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/audio/AudioRecordingHandler.kt
index f033abaea2..7e871e7cda 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/audio/AudioRecordingHandler.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/audio/AudioRecordingHandler.kt
@@ -8,4 +8,5 @@ interface AudioRecordingHandler {
fun onRecordSaved()
fun onRecordMoved(offsetX: Float, absoluteX: Float)
fun onRecordPermissionRequired()
+ fun onRecorderAlreadyInUse()
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java
index 1bf171dce6..43bc5d9e73 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java
@@ -568,6 +568,11 @@ public class InputPanel extends ConstraintLayout
if (listener != null) listener.onRecorderPermissionRequired();
}
+ @Override
+ public void onRecorderAlreadyInUse() {
+ if (listener != null) listener.onRecorderAlreadyInUse();
+ }
+
@Override
public void onRecordPressed() {
if (listener != null) listener.onRecorderStarted();
@@ -815,6 +820,7 @@ public class InputPanel extends ConstraintLayout
void onRecorderFinished();
void onRecorderCanceled(boolean byUser);
void onRecorderPermissionRequired();
+ void onRecorderAlreadyInUse();
void onEmojiToggle();
void onLinkPreviewCanceled();
void onStickerSuggestionSelected(@NonNull StickerRecord sticker);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java b/app/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java
index 67cf6fb5df..19b87f84ce 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java
@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.components;
import android.Manifest;
import android.content.Context;
import android.graphics.PorterDuff;
+import android.media.AudioManager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@@ -19,6 +20,7 @@ import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.audio.AudioRecordingHandler;
@@ -40,12 +42,16 @@ public final class MicrophoneRecorderView extends FrameLayout implements View.On
private @Nullable AudioRecordingHandler handler;
private @NonNull State state = State.NOT_RUNNING;
+ private final AudioManager audioManager;
+
public MicrophoneRecorderView(Context context) {
super(context);
+ this.audioManager = ContextCompat.getSystemService(context, AudioManager.class);
}
public MicrophoneRecorderView(Context context, AttributeSet attrs) {
super(context, attrs);
+ this.audioManager = ContextCompat.getSystemService(context, AudioManager.class);
}
@Override
@@ -110,10 +116,16 @@ public final class MicrophoneRecorderView extends FrameLayout implements View.On
@Override
public boolean onTouch(View v, final MotionEvent event) {
+ boolean isMicPossiblyInUse = false;
+ if (audioManager != null) {
+ isMicPossiblyInUse = audioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION || audioManager.getMode() == AudioManager.MODE_IN_CALL;
+ }
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!Permissions.hasAll(getContext(), Manifest.permission.RECORD_AUDIO)) {
if (handler != null) handler.onRecordPermissionRequired();
+ } else if (isMicPossiblyInUse) {
+ if (handler != null) handler.onRecorderAlreadyInUse();
} else if (state == State.NOT_RUNNING) {
state = State.RUNNING_HELD;
floatingRecordButton.display(event.getX(), event.getY());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt
index 738ecdb0cf..bb5a297dda 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt
@@ -4202,6 +4202,10 @@ class ConversationFragment :
.execute()
}
+ override fun onRecorderAlreadyInUse() {
+ toast(R.string.ConversationFragment_cannot_record_voice_message_during_call)
+ }
+
override fun onEmojiToggle() {
container.toggleInput(MediaKeyboardFragmentCreator, composeText, showSoftKeyOnHide = true)
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 4bbe909cfe..3673ce72f7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -546,6 +546,8 @@
Invite to Signal
You will be reminded again soon.
+
+ Cannot record voice message during call.
Sending formatted text