From b24ab37931635ea280a97ea0a3a102a4c4d469c6 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Fri, 6 Oct 2023 21:21:15 +0200 Subject: [PATCH 1/3] allow to properly click in audio messages in multi-select mode also allow to long-press in play button to select message --- res/layout/audio_view.xml | 12 ++++- .../securesms/ConversationItem.java | 7 ++- .../securesms/ProfileDocumentsAdapter.java | 4 +- .../securesms/components/AudioView.java | 49 ++++++++----------- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/res/layout/audio_view.xml b/res/layout/audio_view.xml index 6253cbe7ba..91d0d631cc 100644 --- a/res/layout/audio_view.xml +++ b/res/layout/audio_view.xml @@ -96,4 +96,14 @@ - \ No newline at end of file + + + diff --git a/src/org/thoughtcrime/securesms/ConversationItem.java b/src/org/thoughtcrime/securesms/ConversationItem.java index 8ab6b2beeb..2011656544 100644 --- a/src/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/org/thoughtcrime/securesms/ConversationItem.java @@ -291,9 +291,7 @@ protected void setInteractionState(DcMsg messageRecord, boolean pulseHighlight) } if (audioViewStub.resolved()) { - audioViewStub.get().setFocusable(!shouldInterceptClicks(messageRecord) && batchSelected.isEmpty()); - audioViewStub.get().setClickable(batchSelected.isEmpty()); - audioViewStub.get().setEnabled(batchSelected.isEmpty()); + audioViewStub.get().disablePlayer(!batchSelected.isEmpty()); } if (documentViewStub.resolved()) { @@ -477,6 +475,7 @@ public void onReceivedDuration(int millis) { } audioViewStub.get().setAudio(new AudioSlide(context, messageRecord), duration); + audioViewStub.get().setOnClickListener(passthroughClickListener); audioViewStub.get().setOnLongClickListener(passthroughClickListener); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { audioViewStub.get().setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); @@ -839,7 +838,7 @@ private int getAvailableMessageBubbleWidth(@NonNull View forView) { @Override public void onAccessibilityClick() { if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().performClick(); - else if (audioViewStub.resolved()) audioViewStub.get().performClick(); + else if (audioViewStub.resolved()) audioViewStub.get().toggleState(); else if (documentViewStub.resolved()) documentViewStub.get().performClick(); else if (webxdcViewStub.resolved()) webxdcViewStub.get().performClick(); } diff --git a/src/org/thoughtcrime/securesms/ProfileDocumentsAdapter.java b/src/org/thoughtcrime/securesms/ProfileDocumentsAdapter.java index c16f47c887..db5bafedd4 100644 --- a/src/org/thoughtcrime/securesms/ProfileDocumentsAdapter.java +++ b/src/org/thoughtcrime/securesms/ProfileDocumentsAdapter.java @@ -106,9 +106,7 @@ public void onBindItemViewHolder(ItemViewHolder itemViewHolder, int section, int viewHolder.audioView.setAudio((AudioSlide)slide, dcMsg.getDuration()); viewHolder.audioView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg)); viewHolder.audioView.setOnLongClickListener(view -> { itemClickListener.onMediaLongClicked(dcMsg); return true; }); - viewHolder.audioView.setFocusable(selected.isEmpty()); - viewHolder.audioView.setClickable(selected.isEmpty()); - viewHolder.audioView.setLongClickable(selected.isEmpty()); + viewHolder.audioView.disablePlayer(!selected.isEmpty()); viewHolder.itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(dcMsg)); } else if (slide != null && slide.isWebxdcDocument()) { diff --git a/src/org/thoughtcrime/securesms/components/AudioView.java b/src/org/thoughtcrime/securesms/components/AudioView.java index 1c3bf19170..372325d063 100644 --- a/src/org/thoughtcrime/securesms/components/AudioView.java +++ b/src/org/thoughtcrime/securesms/components/AudioView.java @@ -10,8 +10,6 @@ import android.media.AudioFocusRequest; import android.media.AudioManager; import android.os.Build; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; @@ -21,6 +19,9 @@ import android.widget.SeekBar; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.audio.AudioSlidePlayer; import org.thoughtcrime.securesms.mms.AudioSlide; @@ -39,6 +40,7 @@ public class AudioView extends FrameLayout implements AudioSlidePlayer.Listener private final @NonNull SeekBar seekBar; private final @NonNull TextView timestamp; private final @NonNull TextView title; + private final @NonNull View mask; private @Nullable AudioSlidePlayer audioSlidePlayer; private AudioManager.OnAudioFocusChangeListener audioFocusChangeListener; @@ -62,6 +64,7 @@ public AudioView(Context context, AttributeSet attrs, int defStyleAttr) { this.seekBar = (SeekBar) findViewById(R.id.seek); this.timestamp = (TextView) findViewById(R.id.timestamp); this.title = (TextView) findViewById(R.id.title); + this.mask = findViewById(R.id.interception_mask); this.timestamp.setText("00:00"); @@ -97,13 +100,25 @@ public void setAudio(final @NonNull AudioSlide audio, int duration) } @Override - public boolean performClick() { + public void setOnClickListener(OnClickListener listener) { + super.setOnClickListener(listener); + this.mask.setOnClickListener(listener); + } + + @Override + public void setOnLongClickListener(OnLongClickListener listener) { + super.setOnLongClickListener(listener); + this.mask.setOnLongClickListener(listener); + this.playButton.setOnLongClickListener(listener); + this.pauseButton.setOnLongClickListener(listener); + } + + public void toggleState() { if (this.playButton.getVisibility() == View.VISIBLE) { playButton.performClick(); } else { pauseButton.performClick(); } - return super.performClick(); } public String getDescription() { @@ -155,30 +170,8 @@ public void onStop() { } } - @Override - public void setFocusable(boolean focusable) { - super.setFocusable(focusable); - this.playButton.setFocusable(focusable); - this.pauseButton.setFocusable(focusable); - this.seekBar.setFocusable(focusable); - this.seekBar.setFocusableInTouchMode(focusable); - } - - @Override - public void setClickable(boolean clickable) { - super.setClickable(clickable); - this.playButton.setClickable(clickable); - this.pauseButton.setClickable(clickable); - this.seekBar.setClickable(clickable); - this.seekBar.setOnTouchListener(clickable ? null : new TouchIgnoringListener()); - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - this.playButton.setEnabled(enabled); - this.pauseButton.setEnabled(enabled); - this.seekBar.setEnabled(enabled); + public void disablePlayer(boolean disable) { + this.mask.setVisibility(disable? View.VISIBLE : View.GONE); } @Override From 4dc1abf135aef6522c938377f0cbfb64b8def158 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Fri, 6 Oct 2023 23:26:21 +0200 Subject: [PATCH 2/3] add comment --- res/layout/audio_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/layout/audio_view.xml b/res/layout/audio_view.xml index 91d0d631cc..15786f1c4a 100644 --- a/res/layout/audio_view.xml +++ b/res/layout/audio_view.xml @@ -96,6 +96,7 @@ + Date: Sat, 7 Oct 2023 00:31:37 +0200 Subject: [PATCH 3/3] rename toggleState() to togglePlay() --- src/org/thoughtcrime/securesms/ConversationItem.java | 2 +- src/org/thoughtcrime/securesms/components/AudioView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ConversationItem.java b/src/org/thoughtcrime/securesms/ConversationItem.java index 2011656544..36fac84310 100644 --- a/src/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/org/thoughtcrime/securesms/ConversationItem.java @@ -838,7 +838,7 @@ private int getAvailableMessageBubbleWidth(@NonNull View forView) { @Override public void onAccessibilityClick() { if (mediaThumbnailStub.resolved()) mediaThumbnailStub.get().performClick(); - else if (audioViewStub.resolved()) audioViewStub.get().toggleState(); + else if (audioViewStub.resolved()) audioViewStub.get().togglePlay(); else if (documentViewStub.resolved()) documentViewStub.get().performClick(); else if (webxdcViewStub.resolved()) webxdcViewStub.get().performClick(); } diff --git a/src/org/thoughtcrime/securesms/components/AudioView.java b/src/org/thoughtcrime/securesms/components/AudioView.java index 372325d063..0a15ccda0d 100644 --- a/src/org/thoughtcrime/securesms/components/AudioView.java +++ b/src/org/thoughtcrime/securesms/components/AudioView.java @@ -113,7 +113,7 @@ public void setOnLongClickListener(OnLongClickListener listener) { this.pauseButton.setOnLongClickListener(listener); } - public void toggleState() { + public void togglePlay() { if (this.playButton.getVisibility() == View.VISIBLE) { playButton.performClick(); } else {