mirror of
https://github.com/M66B/FairEmail.git
synced 2026-03-31 06:08:31 +02:00
Single instance embedded music player
This commit is contained in:
@@ -28,6 +28,7 @@ import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.PowerManager;
|
||||
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
@@ -36,6 +37,7 @@ import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.OnLifecycleEvent;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@@ -46,6 +48,10 @@ public class MediaPlayerHelper {
|
||||
private static Semaphore sem;
|
||||
private static final Object lock = new Object();
|
||||
|
||||
private static MediaPlayer player = null;
|
||||
private static Uri uri = null;
|
||||
private static Runnable onCompleted = null;
|
||||
|
||||
static void stop(Context context) {
|
||||
EntityLog.log(context, "Alarm stop");
|
||||
synchronized (lock) {
|
||||
@@ -155,6 +161,63 @@ public class MediaPlayerHelper {
|
||||
}
|
||||
}
|
||||
|
||||
static void startMusic(Context context, Uri uri, Runnable onCompleted) throws IOException {
|
||||
stopMusic(context);
|
||||
|
||||
synchronized (lock) {
|
||||
MediaPlayerHelper.uri = uri;
|
||||
MediaPlayerHelper.onCompleted = onCompleted;
|
||||
|
||||
MediaPlayerHelper.player = new MediaPlayer();
|
||||
MediaPlayerHelper.player.setAudioAttributes(
|
||||
new AudioAttributes.Builder()
|
||||
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
|
||||
.setUsage(AudioAttributes.USAGE_MEDIA)
|
||||
.build()
|
||||
);
|
||||
MediaPlayerHelper.player.setDataSource(context, uri);
|
||||
MediaPlayerHelper.player.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);
|
||||
MediaPlayerHelper.player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
|
||||
@Override
|
||||
public void onPrepared(MediaPlayer mp) {
|
||||
// https://issuetracker.google.com/issues/36921987
|
||||
mp.start();
|
||||
}
|
||||
});
|
||||
MediaPlayerHelper.player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
|
||||
@Override
|
||||
public void onCompletion(MediaPlayer mp) {
|
||||
stopMusic(context);
|
||||
}
|
||||
});
|
||||
MediaPlayerHelper.player.prepareAsync();
|
||||
}
|
||||
}
|
||||
|
||||
static void stopMusic(Context context) {
|
||||
synchronized (lock) {
|
||||
if (MediaPlayerHelper.player != null)
|
||||
try {
|
||||
MediaPlayerHelper.player.stop();
|
||||
} catch (Throwable ex) {
|
||||
Log.e(ex);
|
||||
} finally {
|
||||
MediaPlayerHelper.player = null;
|
||||
}
|
||||
MediaPlayerHelper.uri = null;
|
||||
if (MediaPlayerHelper.onCompleted != null) {
|
||||
MediaPlayerHelper.onCompleted.run();
|
||||
MediaPlayerHelper.onCompleted = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static boolean isPlaying(Uri uri) {
|
||||
synchronized (lock) {
|
||||
return (Objects.equals(MediaPlayerHelper.uri, uri));
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user