From 12253d984695f6365770166e588ba796347a8c83 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 27 Jan 2024 09:35:08 +0100 Subject: [PATCH] Added progress indication to audio player --- .../java/eu/faircode/email/AdapterMedia.java | 36 ++++++++++++++----- .../eu/faircode/email/MediaPlayerHelper.java | 12 +++++++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMedia.java b/app/src/main/java/eu/faircode/email/AdapterMedia.java index f4804ab221..5c29157b66 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMedia.java +++ b/app/src/main/java/eu/faircode/email/AdapterMedia.java @@ -35,6 +35,7 @@ import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import android.text.TextUtils; +import android.util.Pair; import android.util.Size; import android.view.LayoutInflater; import android.view.View; @@ -94,11 +95,13 @@ public class AdapterMedia extends RecyclerView.Adapter view.setOnLongClickListener(null); } - private void showPlayerState(EntityAttachment attachment) { - if (MediaPlayerHelper.isPlaying(attachment.getUri(context))) + private void showPlayerState(Uri uri) { + if (MediaPlayerHelper.isPlaying(uri)) ivImage.setImageResource(R.drawable.twotone_stop_48); - else + else { ivImage.setImageResource(R.drawable.twotone_play_arrow_48); + tvProperties.setVisibility(View.GONE); + } } private void bindTo(EntityAttachment attachment) { @@ -108,7 +111,7 @@ public class AdapterMedia extends RecyclerView.Adapter if (attachment.available) { if (attachment.isAudio()) { - showPlayerState(attachment); + showPlayerState(attachment.getUri(context)); return; } @@ -281,16 +284,33 @@ public class AdapterMedia extends RecyclerView.Adapter Uri uri = attachment.getUri(context); if (MediaPlayerHelper.isPlaying(uri)) MediaPlayerHelper.stopMusic(context); - else + else { + Runnable updatePosition = new RunnableEx("updatePosition") { + @Override + protected void delegate() { + Pair pos = MediaPlayerHelper.getPosition(uri); + if (pos != null) { + int at = (int) Math.round(pos.first / 1000.0) * 1000; + tvProperties.setText( + Helper.formatDuration(at, false) + " / " + + Helper.formatDuration(pos.second, true)); + view.postDelayed(this, 1000L); + } + tvProperties.setVisibility(pos == null ? View.GONE : View.VISIBLE); + } + }; + view.postDelayed(updatePosition, 1000L); + MediaPlayerHelper.startMusic(context, uri, - new RunnableEx("player") { + new RunnableEx("onCompleted") { @Override public void delegate() { - showPlayerState(attachment); + showPlayerState(uri); } }); + } - showPlayerState(attachment); + showPlayerState(uri); } catch (Throwable ex) { ivImage.setImageResource(R.drawable.twotone_warning_24); Log.unexpectedError(parentFragment, ex); diff --git a/app/src/main/java/eu/faircode/email/MediaPlayerHelper.java b/app/src/main/java/eu/faircode/email/MediaPlayerHelper.java index c1df73b361..5a3dd02557 100644 --- a/app/src/main/java/eu/faircode/email/MediaPlayerHelper.java +++ b/app/src/main/java/eu/faircode/email/MediaPlayerHelper.java @@ -29,6 +29,7 @@ import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.PowerManager; +import android.util.Pair; import androidx.core.app.NotificationCompat; import androidx.lifecycle.Lifecycle; @@ -218,6 +219,17 @@ public class MediaPlayerHelper { } } + static Pair getPosition(Uri uri) { + synchronized (lock) { + if (!isPlaying(uri)) + return null; + return new Pair<>( + MediaPlayerHelper.player.getCurrentPosition(), + MediaPlayerHelper.player.getDuration() + ); + } + } + static void liveInCall(Context context, LifecycleOwner owner, IInCall intf) { AudioManager am = Helper.getSystemService(context, AudioManager.class); if (am == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {