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