Voice Note Beta Feedback fixes.

This commit is contained in:
Alex Hart
2020-10-16 13:14:01 -03:00
committed by GitHub
parent 36da519b26
commit 082d9e852c
9 changed files with 145 additions and 27 deletions

View File

@@ -36,6 +36,7 @@ import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.attachments.AttachmentId;
import org.thoughtcrime.securesms.components.AudioView;
import org.thoughtcrime.securesms.components.ThumbnailView;
import org.thoughtcrime.securesms.components.voice.VoiceNotePlaybackState;
import org.thoughtcrime.securesms.database.MediaDatabase;
import org.thoughtcrime.securesms.database.MediaDatabase.MediaRecord;
import org.thoughtcrime.securesms.database.loaders.GroupedThreadMediaLoader.GroupedThreadMedia;
@@ -56,6 +57,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
@@ -64,7 +66,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
private final GlideRequests glideRequests;
private final ItemClickListener itemClickListener;
private final Map<AttachmentId, MediaRecord> selected = new HashMap<>();
private final AudioView.Callbacks audioViewCallbacks;
private final AudioItemListener audioItemListener;
private GroupedThreadMedia media;
private boolean showFileSizes;
@@ -94,7 +96,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
@NonNull GlideRequests glideRequests,
GroupedThreadMedia media,
ItemClickListener clickListener,
@NonNull AudioView.Callbacks audioViewCallbacks,
@NonNull AudioItemListener audioItemListener,
boolean showFileSizes,
boolean showThread)
{
@@ -102,7 +104,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
this.glideRequests = glideRequests;
this.media = media;
this.itemClickListener = clickListener;
this.audioViewCallbacks = audioViewCallbacks;
this.audioItemListener = audioItemListener;
this.showFileSizes = showFileSizes;
this.showThread = showThread;
}
@@ -435,11 +437,22 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
throw new AssertionError();
}
audioView.setAudio((AudioSlide) slide, audioViewCallbacks, true);
long mmsId = Objects.requireNonNull(mediaRecord.getAttachment()).getMmsId();
audioItemListener.unregisterPlaybackStateObserver(audioView.getPlaybackStateObserver());
audioView.setAudio((AudioSlide) slide, new AudioViewCallbacksAdapter(audioItemListener, mmsId), true);
audioItemListener.registerPlaybackStateObserver(audioView.getPlaybackStateObserver());
audioView.setOnClickListener(view -> itemClickListener.onMediaClicked(mediaRecord));
itemView.setOnClickListener(view -> itemClickListener.onMediaClicked(mediaRecord));
}
@Override
void unbind() {
super.unbind();
audioItemListener.unregisterPlaybackStateObserver(audioView.getPlaybackStateObserver());
}
@Override
protected String getFileTypeDescription(@NonNull Context context, @NonNull Slide slide) {
return context.getString(R.string.MediaOverviewActivity_audio);
@@ -478,8 +491,48 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
}
}
private static final class AudioViewCallbacksAdapter implements AudioView.Callbacks {
private final AudioItemListener audioItemListener;
private final long messageId;
private AudioViewCallbacksAdapter(@NonNull AudioItemListener audioItemListener, long messageId) {
this.audioItemListener = audioItemListener;
this.messageId = messageId;
}
@Override
public void onPlay(@NonNull Uri audioUri, long position) {
audioItemListener.onPlay(audioUri, position, messageId);
}
@Override
public void onPause(@NonNull Uri audioUri) {
audioItemListener.onPause(audioUri);
}
@Override
public void onSeekTo(@NonNull Uri audioUri, long position) {
audioItemListener.onSeekTo(audioUri, position);
}
@Override
public void onStopAndReset(@NonNull Uri audioUri) {
audioItemListener.onStopAndReset(audioUri);
}
}
interface ItemClickListener {
void onMediaClicked(@NonNull MediaDatabase.MediaRecord mediaRecord);
void onMediaLongClicked(MediaDatabase.MediaRecord mediaRecord);
}
interface AudioItemListener {
void onPlay(@NonNull Uri audioUri, long position, long messageId);
void onPause(@NonNull Uri audioUri);
void onSeekTo(@NonNull Uri audioUri, long position);
void onStopAndReset(@NonNull Uri audioUri);
void registerPlaybackStateObserver(@NonNull Observer<VoiceNotePlaybackState> observer);
void unregisterPlaybackStateObserver(@NonNull Observer<VoiceNotePlaybackState> observer);
}
}

View File

@@ -22,6 +22,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ActionMode;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.Observer;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.RecyclerView;
@@ -31,8 +32,8 @@ import com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager;
import org.thoughtcrime.securesms.MediaPreviewActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.components.AudioView;
import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaController;
import org.thoughtcrime.securesms.components.voice.VoiceNotePlaybackState;
import org.thoughtcrime.securesms.database.MediaDatabase;
import org.thoughtcrime.securesms.database.loaders.GroupedThreadMediaLoader;
import org.thoughtcrime.securesms.database.loaders.MediaLoader;
@@ -44,7 +45,7 @@ import org.thoughtcrime.securesms.util.Util;
public final class MediaOverviewPageFragment extends Fragment
implements MediaGalleryAllAdapter.ItemClickListener,
AudioView.Callbacks,
MediaGalleryAllAdapter.AudioItemListener,
LoaderManager.LoaderCallbacks<GroupedThreadMediaLoader.GroupedThreadMedia>
{
@@ -310,8 +311,8 @@ public final class MediaOverviewPageFragment extends Fragment
}
@Override
public void onPlay(@NonNull Uri audioUri, long position) {
voiceNoteMediaController.startPlayback(audioUri, -1, position);
public void onPlay(@NonNull Uri audioUri, long position, long messageId) {
voiceNoteMediaController.startSinglePlayback(audioUri, messageId, position);
}
@Override
@@ -329,6 +330,16 @@ public final class MediaOverviewPageFragment extends Fragment
voiceNoteMediaController.stopPlaybackAndReset(audioUri);
}
@Override
public void registerPlaybackStateObserver(@NonNull Observer<VoiceNotePlaybackState> observer) {
voiceNoteMediaController.getVoiceNotePlaybackState().observe(getViewLifecycleOwner(), observer);
}
@Override
public void unregisterPlaybackStateObserver(@NonNull Observer<VoiceNotePlaybackState> observer) {
voiceNoteMediaController.getVoiceNotePlaybackState().removeObserver(observer);
}
private class ActionModeCallback implements ActionMode.Callback {
private int originalStatusBarColor;