Skip to content

Commit 521fc72

Browse files
Sagar0-0isopod-a
authored andcommitted
Support scheduled voice notes.
Resolves signalapp#13957
1 parent 469606f commit 521fc72

File tree

6 files changed

+54
-21
lines changed

6 files changed

+54
-21
lines changed

app/src/main/java/org/thoughtcrime/securesms/audio/AudioRecordingHandler.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ interface AudioRecordingHandler {
55
fun onRecordReleased()
66
fun onRecordCanceled(byUser: Boolean)
77
fun onRecordLocked()
8+
fun onRecordSaved()
89
fun onRecordMoved(offsetX: Float, absoluteX: Float)
910
fun onRecordPermissionRequired()
1011
}

app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
import org.thoughtcrime.securesms.database.model.Quote;
6363
import org.thoughtcrime.securesms.database.model.StickerRecord;
6464
import org.thoughtcrime.securesms.keyboard.KeyboardPage;
65-
import org.thoughtcrime.securesms.keyvalue.SignalStore;
6665
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
6766
import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository;
6867
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader;
@@ -625,10 +624,21 @@ public void onRecordLocked() {
625624
if (listener != null) listener.onRecorderLocked();
626625
}
627626

627+
@Override
628+
public void onRecordSaved() {
629+
Log.d(TAG, "Recording saved");
630+
onRecordHideEvent();
631+
if (listener != null) listener.onRecorderSaveDraft();
632+
}
633+
628634
public void onPause() {
629635
this.microphoneRecorderView.cancelAction(false);
630636
}
631637

638+
public void onSaveRecordDraft() {
639+
this.microphoneRecorderView.saveAction();
640+
}
641+
632642
public @NonNull Observer<VoiceNotePlaybackState> getPlaybackStateObserver() {
633643
return voiceNoteDraftView.getPlaybackStateObserver();
634644
}
@@ -692,7 +702,7 @@ public boolean isRecordingInLockedMode() {
692702
return microphoneRecorderView.isRecordingLocked();
693703
}
694704

695-
public void releaseRecordingLock() {
705+
public void releaseRecordingLockAndSend() {
696706
microphoneRecorderView.unlockAction();
697707
}
698708

@@ -794,6 +804,7 @@ private void updateVisibility() {
794804
public interface Listener extends VoiceNoteDraftView.Listener {
795805
void onRecorderStarted();
796806
void onRecorderLocked();
807+
void onRecorderSaveDraft();
797808
void onRecorderFinished();
798809
void onRecorderCanceled(boolean byUser);
799810
void onRecorderPermissionRequired();

app/src/main/java/org/thoughtcrime/securesms/components/MicrophoneRecorderView.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ public void cancelAction(boolean byUser) {
7070
}
7171
}
7272

73+
public void saveAction() {
74+
if (state != State.NOT_RUNNING) {
75+
state = State.NOT_RUNNING;
76+
hideUi();
77+
78+
if (handler != null) {
79+
handler.onRecordSaved();
80+
}
81+
}
82+
}
83+
7384
public boolean isRecordingLocked() {
7485
return state == State.RUNNING_LOCKED;
7586
}

app/src/main/java/org/thoughtcrime/securesms/components/SendButton.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,11 @@ class SendButton(context: Context, attributeSet: AttributeSet?) : AppCompatImage
4141
if (!isEnabled) {
4242
return false
4343
}
44-
45-
val scheduleListener = scheduledSendListener
46-
47-
return if (scheduleListener?.canSchedule() == true) {
48-
scheduleListener.onSendScheduled()
49-
true
50-
} else {
51-
false
52-
}
44+
scheduledSendListener?.onSendScheduled()
45+
return true
5346
}
5447

5548
interface ScheduledSendListener {
5649
fun onSendScheduled()
57-
fun canSchedule(): Boolean
5850
}
5951
}

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1840,7 +1840,8 @@ class ConversationFragment :
18401840
slide: Slide? = null,
18411841
contacts: List<Contact> = emptyList(),
18421842
quote: QuoteModel? = null,
1843-
clearCompose: Boolean = true
1843+
clearCompose: Boolean = true,
1844+
scheduledDate: Long = -1
18441845
) {
18451846
sendMessage(
18461847
slideDeck = slide?.let { SlideDeck().apply { addSlide(slide) } },
@@ -1852,7 +1853,8 @@ class ConversationFragment :
18521853
messageToEdit = null,
18531854
quote = quote,
18541855
linkPreviews = emptyList(),
1855-
bypassPreSendSafetyNumberCheck = true
1856+
bypassPreSendSafetyNumberCheck = true,
1857+
scheduledDate = scheduledDate
18561858
)
18571859
}
18581860

@@ -1892,19 +1894,24 @@ class ConversationFragment :
18921894
}
18931895

18941896
if (inputPanel.isRecordingInLockedMode) {
1895-
inputPanel.releaseRecordingLock()
1897+
inputPanel.releaseRecordingLockAndSend()
18961898
return
18971899
}
18981900

18991901
if (slideDeck == null) {
19001902
val voiceNote: DraftTable.Draft? = draftViewModel.voiceNoteDraft
19011903
if (voiceNote != null) {
1902-
sendMessageWithoutComposeInput(slide = AudioSlide.createFromVoiceNoteDraft(voiceNote), clearCompose = true)
1904+
sendMessageWithoutComposeInput(
1905+
slide = AudioSlide.createFromVoiceNoteDraft(voiceNote),
1906+
quote = quote,
1907+
clearCompose = true,
1908+
scheduledDate = scheduledDate
1909+
)
19031910
return
19041911
}
19051912
}
19061913

1907-
if (body.isNullOrBlank() && slideDeck?.containsMediaSlide() != true && preUploadResults.isEmpty() && contacts.isEmpty()) {
1914+
if (body.isBlank() && slideDeck?.containsMediaSlide() != true && preUploadResults.isEmpty() && contacts.isEmpty()) {
19081915
Log.i(TAG, "Unable to send due to empty message")
19091916
toast(R.string.ConversationActivity_message_is_empty_exclamation)
19101917
return
@@ -3970,6 +3977,10 @@ class ConversationFragment :
39703977
}
39713978

39723979
override fun onSendScheduled() {
3980+
if (inputPanel.isRecordingInLockedMode) {
3981+
inputPanel.onSaveRecordDraft()
3982+
}
3983+
39733984
ScheduleMessageContextMenu.show(sendButton, (requireView() as ViewGroup)) { time ->
39743985
if (time == -1L) {
39753986
showSchedule(childFragmentManager)
@@ -3978,10 +3989,6 @@ class ConversationFragment :
39783989
}
39793990
}
39803991
}
3981-
3982-
override fun canSchedule(): Boolean {
3983-
return !(inputPanel.isRecordingInLockedMode || draftViewModel.voiceNoteDraft != null)
3984-
}
39853992
}
39863993

39873994
private inner class ComposeTextEventsListener :
@@ -4126,6 +4133,11 @@ class ConversationFragment :
41264133
voiceMessageRecordingDelegate.onRecorderCanceled(byUser)
41274134
}
41284135

4136+
override fun onRecorderSaveDraft() {
4137+
voiceMessageRecordingDelegate.onRecordSaveDraft()
4138+
inputPanel.voiceNoteDraft = draftViewModel.voiceNoteDraft
4139+
}
4140+
41294141
override fun onRecorderPermissionRequired() {
41304142
Permissions
41314143
.with(this@ConversationFragment)

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ class VoiceMessageRecordingDelegate(
6969
}
7070
}
7171

72+
fun onRecordSaveDraft() {
73+
voiceRecorderWakeLock.release()
74+
vibrateAndResetOrientation(50)
75+
session?.saveDraft()
76+
}
77+
7278
@Suppress("DEPRECATION")
7379
private fun vibrateAndResetOrientation(milliseconds: Long) {
7480
val activity = fragment.activity

0 commit comments

Comments
 (0)