Revert "improve battery consumption"

This commit is contained in:
eddyizm 2025-11-04 07:02:19 -08:00 committed by GitHub
parent 24eead2d0a
commit d5d504fc64
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 73 additions and 221 deletions

View file

@ -4,12 +4,7 @@ import android.annotation.SuppressLint
import android.app.PendingIntent.FLAG_IMMUTABLE import android.app.PendingIntent.FLAG_IMMUTABLE
import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.app.TaskStackBuilder import android.app.TaskStackBuilder
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.Network import android.net.Network
import android.net.NetworkCapabilities import android.net.NetworkCapabilities
@ -18,21 +13,15 @@ import android.os.Bundle
import android.os.IBinder import android.os.IBinder
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.text.TextUtils
import android.util.Log import android.util.Log
import androidx.media3.common.* import androidx.media3.common.*
import androidx.media3.common.Player.REPEAT_MODE_ALL
import androidx.media3.common.Player.RepeatMode
import androidx.media3.common.util.UnstableApi import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.DefaultLoadControl import androidx.media3.exoplayer.DefaultLoadControl
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.source.MediaSource import androidx.media3.exoplayer.source.MediaSource
import androidx.media3.session.* import androidx.media3.session.*
import androidx.media3.session.MediaSession.ControllerInfo import androidx.media3.session.MediaSession.ControllerInfo
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.cappielloantonio.tempo.R import com.cappielloantonio.tempo.R
import com.cappielloantonio.tempo.glide.CustomGlideRequest
import com.cappielloantonio.tempo.repository.QueueRepository import com.cappielloantonio.tempo.repository.QueueRepository
import com.cappielloantonio.tempo.ui.activity.MainActivity import com.cappielloantonio.tempo.ui.activity.MainActivity
import com.cappielloantonio.tempo.util.AssetLinkUtil import com.cappielloantonio.tempo.util.AssetLinkUtil
@ -46,7 +35,6 @@ import com.cappielloantonio.tempo.widget.WidgetUpdateManager
import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableList
import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.Futures
import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.ListenableFuture
import java.util.Optional
@UnstableApi @UnstableApi
@ -65,7 +53,7 @@ class MediaService : MediaLibraryService() {
private var widgetUpdateScheduled = false private var widgetUpdateScheduled = false
private val widgetUpdateRunnable = object : Runnable { private val widgetUpdateRunnable = object : Runnable {
override fun run() { override fun run() {
if (!player.isPlaying || !screenOn) { if (!player.isPlaying) {
widgetUpdateScheduled = false widgetUpdateScheduled = false
return return
} }
@ -74,29 +62,6 @@ class MediaService : MediaLibraryService() {
} }
} }
private var prevPlayerStates = Triple(false, false, -1)
@Volatile private var nowPlayingChanged = false
@Volatile private var artCacheUpdated = false
@Volatile private var artCache : Bitmap? = null
@Volatile private var screenOn = true
val broadCastReceiver = object : BroadcastReceiver() {
override fun onReceive(contxt: Context?, intent: Intent?) {
when (intent?.action) {
Intent.ACTION_SCREEN_ON -> {
Log.d("MediaService", "screenOn");
screenOn = true
widgetUpdateHandler.post(widgetUpdateRunnable)
}
Intent.ACTION_SCREEN_OFF -> {
Log.d("MediaService", "screenOff");
screenOn = false
}
}
}
}
inner class LocalBinder : Binder() { inner class LocalBinder : Binder() {
fun getEqualizerManager(): EqualizerManager { fun getEqualizerManager(): EqualizerManager {
return this@MediaService.equalizerManager return this@MediaService.equalizerManager
@ -119,6 +84,16 @@ class MediaService : MediaLibraryService() {
const val ACTION_BIND_EQUALIZER = "com.cappielloantonio.tempo.service.BIND_EQUALIZER" const val ACTION_BIND_EQUALIZER = "com.cappielloantonio.tempo.service.BIND_EQUALIZER"
} }
fun updateMediaItems() {
Log.d("MediaService", "update items");
val n = player.mediaItemCount
val k = player.currentMediaItemIndex
val current = player.currentPosition
val items = (0 .. n-1).map{i -> MappingUtil.mapMediaItem(player.getMediaItemAt(i))}
player.clearMediaItems()
player.setMediaItems(items, k, current)
}
inner class CustomNetworkCallback : ConnectivityManager.NetworkCallback() { inner class CustomNetworkCallback : ConnectivityManager.NetworkCallback() {
var wasWifi = false var wasWifi = false
@ -135,15 +110,7 @@ class MediaService : MediaLibraryService() {
if (isWifi != wasWifi) { if (isWifi != wasWifi) {
wasWifi = isWifi wasWifi = isWifi
widgetUpdateHandler.post(Runnable { widgetUpdateHandler.post(Runnable {
Log.d("MediaService", "update item due to network change"); updateMediaItems()
val pos = player.currentPosition
val k = player.currentMediaItemIndex
val old = player.getMediaItemAt(k)
val item = MappingUtil.mapMediaItem(old)
if (item.requestMetadata.mediaUri != old.requestMetadata.mediaUri) {
player.replaceMediaItem(k, item)
player.seekTo(pos)
}
}) })
} }
} }
@ -159,7 +126,6 @@ class MediaService : MediaLibraryService() {
initializePlayerListener() initializePlayerListener()
initializeEqualizerManager() initializeEqualizerManager()
initializeNetworkListener() initializeNetworkListener()
initializeScreenListener()
setPlayer(player) setPlayer(player)
} }
@ -169,7 +135,6 @@ class MediaService : MediaLibraryService() {
} }
override fun onDestroy() { override fun onDestroy() {
unregisterReceiver(broadCastReceiver)
releaseNetworkCallback() releaseNetworkCallback()
equalizerManager.release() equalizerManager.release()
stopWidgetUpdates() stopWidgetUpdates()
@ -311,23 +276,10 @@ class MediaService : MediaLibraryService() {
.setLoadControl(initializeLoadControl()) .setLoadControl(initializeLoadControl())
.build() .build()
val params = player.trackSelectionParameters.buildUpon()
.setAudioOffloadPreferences(
TrackSelectionParameters.AudioOffloadPreferences.Builder().setAudioOffloadMode(
TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED
).build()
).build()
player.trackSelectionParameters = params
player.shuffleModeEnabled = Preferences.isShuffleModeEnabled() player.shuffleModeEnabled = Preferences.isShuffleModeEnabled()
player.repeatMode = Preferences.getRepeatMode() player.repeatMode = Preferences.getRepeatMode()
} }
private fun initializeScreenListener() {
val filter = IntentFilter(Intent.ACTION_SCREEN_ON)
filter.addAction(Intent.ACTION_SCREEN_OFF)
registerReceiver(broadCastReceiver, filter)
}
private fun initializeEqualizerManager() { private fun initializeEqualizerManager() {
equalizerManager = EqualizerManager() equalizerManager = EqualizerManager()
val audioSessionId = player.audioSessionId val audioSessionId = player.audioSessionId
@ -363,6 +315,7 @@ class MediaService : MediaLibraryService() {
private fun initializeNetworkListener() { private fun initializeNetworkListener() {
networkCallback = CustomNetworkCallback() networkCallback = CustomNetworkCallback()
getSystemService(ConnectivityManager::class.java).registerDefaultNetworkCallback(networkCallback) getSystemService(ConnectivityManager::class.java).registerDefaultNetworkCallback(networkCallback)
updateMediaItems()
} }
private fun restorePlayerFromQueue() { private fun restorePlayerFromQueue() {
@ -406,35 +359,15 @@ class MediaService : MediaLibraryService() {
override fun onTracksChanged(tracks: Tracks) { override fun onTracksChanged(tracks: Tracks) {
ReplayGainUtil.setReplayGain(player, tracks) ReplayGainUtil.setReplayGain(player, tracks)
val currentMediaItem = player.currentMediaItem val currentMediaItem = player.currentMediaItem
if (currentMediaItem != null && currentMediaItem.mediaMetadata.extras != null) {
if (currentMediaItem != null) { MediaManager.scrobble(currentMediaItem, false)
val item = MappingUtil.mapMediaItem(currentMediaItem)
if (item.requestMetadata.mediaUri != currentMediaItem.requestMetadata.mediaUri)
player.replaceMediaItem(player.currentMediaItemIndex, item)
if (item.mediaMetadata.extras != null) {
MediaManager.scrobble(item, false)
}
} }
if (player.currentMediaItemIndex + 1 < player.mediaItemCount) if (player.currentMediaItemIndex + 1 == player.mediaItemCount)
player.replaceMediaItem(
player.currentMediaItemIndex + 1,
MappingUtil.mapMediaItem(player.getMediaItemAt(player.currentMediaItemIndex + 1)))
if (player.currentMediaItemIndex + 1 == player.mediaItemCount) {
if (player.repeatMode == REPEAT_MODE_ALL && player.mediaItemCount > 1)
player.replaceMediaItem(
0,
MappingUtil.mapMediaItem(player.getMediaItemAt(0)))
MediaManager.continuousPlay(player.currentMediaItem) MediaManager.continuousPlay(player.currentMediaItem)
} }
}
override fun onIsPlayingChanged(isPlaying: Boolean) { override fun onIsPlayingChanged(isPlaying: Boolean) {
nowPlayingChanged = true
artCacheUpdated = false
artCache = null
if (!isPlaying) { if (!isPlaying) {
MediaManager.setPlayingPausedTimestamp( MediaManager.setPlayingPausedTimestamp(
player.currentMediaItem, player.currentMediaItem,
@ -448,7 +381,6 @@ class MediaService : MediaLibraryService() {
} else { } else {
stopWidgetUpdates() stopWidgetUpdates()
} }
if (screenOn)
updateWidget() updateWidget()
} }
@ -562,16 +494,6 @@ class MediaService : MediaLibraryService() {
.build() .build()
} }
private inner class CustomGlideTarget : CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
artCache = resource
}
override fun onLoadCleared(placeholder: Drawable?) {
artCache = null
}
}
private fun updateWidget() { private fun updateWidget() {
val mi = player.currentMediaItem val mi = player.currentMediaItem
val title = mi?.mediaMetadata?.title?.toString() val title = mi?.mediaMetadata?.title?.toString()
@ -590,23 +512,12 @@ class MediaService : MediaLibraryService() {
?: AssetLinkUtil.buildLink(AssetLinkUtil.TYPE_ARTIST, extras?.getString("artistId")) ?: AssetLinkUtil.buildLink(AssetLinkUtil.TYPE_ARTIST, extras?.getString("artistId"))
val position = player.currentPosition.takeIf { it != C.TIME_UNSET } ?: 0L val position = player.currentPosition.takeIf { it != C.TIME_UNSET } ?: 0L
val duration = player.duration.takeIf { it != C.TIME_UNSET } ?: 0L val duration = player.duration.takeIf { it != C.TIME_UNSET } ?: 0L
if (!TextUtils.isEmpty(coverId) && nowPlayingChanged) {
CustomGlideRequest.loadAlbumArtBitmap(
applicationContext,
coverId,
WidgetUpdateManager.WIDGET_SAFE_ART_SIZE,
CustomGlideTarget())
}
val newPlayerState = Triple(player.isPlaying, player.shuffleModeEnabled, player.repeatMode)
if (nowPlayingChanged || prevPlayerStates != newPlayerState) {
WidgetUpdateManager.updateFromState( WidgetUpdateManager.updateFromState(
this, this,
title ?: "", title ?: "",
artist ?: "", artist ?: "",
album ?: "", album ?: "",
Optional.ofNullable(artCache), coverId,
player.isPlaying, player.isPlaying,
player.shuffleModeEnabled, player.shuffleModeEnabled,
player.repeatMode, player.repeatMode,
@ -616,13 +527,6 @@ class MediaService : MediaLibraryService() {
albumLink, albumLink,
artistLink artistLink
) )
prevPlayerStates = newPlayerState
Log.d("MediaService", "fullUpdate");
} else {
WidgetUpdateManager.updateProgress(this, position, duration)
Log.d("MediaService", "updateProgress");
}
nowPlayingChanged = false
} }
private fun scheduleWidgetUpdates() { private fun scheduleWidgetUpdates() {

View file

@ -3,7 +3,6 @@ package com.cappielloantonio.tempo.ui.fragment;
import android.content.ComponentName; import android.content.ComponentName;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -48,7 +47,7 @@ public class PlayerBottomSheetFragment extends Fragment {
private PlayerBottomSheetViewModel playerBottomSheetViewModel; private PlayerBottomSheetViewModel playerBottomSheetViewModel;
private ListenableFuture<MediaBrowser> mediaBrowserListenableFuture; private ListenableFuture<MediaBrowser> mediaBrowserListenableFuture;
private Handler progressBarHandler = null; private Handler progressBarHandler;
private Runnable progressBarRunnable; private Runnable progressBarRunnable;
@Nullable @Nullable
@ -67,14 +66,6 @@ public class PlayerBottomSheetFragment extends Fragment {
return view; return view;
} }
@Override
public void onResume() {
super.onResume();
if (progressBarHandler != null)
progressBarHandler.post(progressBarRunnable);
Log.d("Player", "resumed");
}
@Override @Override
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
@ -290,10 +281,6 @@ public class PlayerBottomSheetFragment extends Fragment {
private void defineProgressBarHandler(MediaBrowser mediaBrowser) { private void defineProgressBarHandler(MediaBrowser mediaBrowser) {
progressBarHandler = new Handler(); progressBarHandler = new Handler();
progressBarRunnable = () -> { progressBarRunnable = () -> {
if (!isResumed()) {
Log.d("Player", "not resumed");
return;
}
setProgress(mediaBrowser); setProgress(mediaBrowser);
progressBarHandler.postDelayed(progressBarRunnable, 1000); progressBarHandler.postDelayed(progressBarRunnable, 1000);
}; };

View file

@ -7,16 +7,13 @@ import android.graphics.Bitmap;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils; import android.text.TextUtils;
import android.widget.RemoteViews;
import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition; import com.bumptech.glide.request.transition.Transition;
import com.cappielloantonio.tempo.glide.CustomGlideRequest; import com.cappielloantonio.tempo.glide.CustomGlideRequest;
import com.cappielloantonio.tempo.R; import com.cappielloantonio.tempo.R;
import androidx.annotation.OptIn;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.session.MediaController; import androidx.media3.session.MediaController;
import androidx.media3.session.SessionToken; import androidx.media3.session.SessionToken;
@ -26,18 +23,17 @@ import com.cappielloantonio.tempo.util.MusicUtil;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import java.util.Optional;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
public final class WidgetUpdateManager { public final class WidgetUpdateManager {
public static final int WIDGET_SAFE_ART_SIZE = 512; private static final int WIDGET_SAFE_ART_SIZE = 512;
public static void updateFromState(Context ctx, public static void updateFromState(Context ctx,
String title, String title,
String artist, String artist,
String album, String album,
Optional<Bitmap> art, Bitmap art,
boolean playing, boolean playing,
boolean shuffleEnabled, boolean shuffleEnabled,
int repeatMode, int repeatMode,
@ -55,47 +51,13 @@ public final class WidgetUpdateManager {
AppWidgetManager mgr = AppWidgetManager.getInstance(ctx); AppWidgetManager mgr = AppWidgetManager.getInstance(ctx);
int[] ids = mgr.getAppWidgetIds(new ComponentName(ctx, WidgetProvider4x1.class)); int[] ids = mgr.getAppWidgetIds(new ComponentName(ctx, WidgetProvider4x1.class));
for (int id : ids) { for (int id : ids) {
android.widget.RemoteViews rv = choosePopulate(ctx, title, artist, album, art.orElse(null), playing, android.widget.RemoteViews rv = choosePopulate(ctx, title, artist, album, art, playing,
timing.elapsedText, timing.totalText, timing.progress, shuffleEnabled, repeatMode, id); timing.elapsedText, timing.totalText, timing.progress, shuffleEnabled, repeatMode, id);
WidgetProvider.attachIntents(ctx, rv, id, songLink, albumLink, artistLink); WidgetProvider.attachIntents(ctx, rv, id, songLink, albumLink, artistLink);
mgr.updateAppWidget(id, rv); mgr.updateAppWidget(id, rv);
} }
} }
public static void updateProgress(Context ctx,
long positionMs,
long durationMs) {
final TimingInfo timing = createTimingInfo(positionMs, durationMs);
AppWidgetManager mgr = AppWidgetManager.getInstance(ctx);
int[] ids = mgr.getAppWidgetIds(new ComponentName(ctx, WidgetProvider4x1.class));
for (int id : ids) {
LayoutSize size = resolveLayoutSize(ctx, id);
int layoutRes = 0;
switch (size) {
case MEDIUM:
layoutRes = R.layout.widget_layout_medium;
break;
case LARGE:
layoutRes = R.layout.widget_layout_large_short;
break;
case EXPANDED:
layoutRes = R.layout.widget_layout_large;
break;
case COMPACT:
default:
layoutRes = R.layout.widget_layout_compact;
break;
}
RemoteViews rv = new RemoteViews(ctx.getPackageName(), layoutRes);
int safeProgress = Math.max(0, Math.min(timing.progress, WidgetViewsFactory.PROGRESS_MAX));
rv.setTextViewText(R.id.time_elapsed, timing.elapsedText);
rv.setTextViewText(R.id.time_total, timing.totalText);
rv.setProgressBar(R.id.progress, WidgetViewsFactory.PROGRESS_MAX, safeProgress, false);
mgr.updateAppWidget(id, rv);
}
}
public static void pushNow(Context ctx) { public static void pushNow(Context ctx) {
AppWidgetManager mgr = AppWidgetManager.getInstance(ctx); AppWidgetManager mgr = AppWidgetManager.getInstance(ctx);
int[] ids = mgr.getAppWidgetIds(new ComponentName(ctx, WidgetProvider4x1.class)); int[] ids = mgr.getAppWidgetIds(new ComponentName(ctx, WidgetProvider4x1.class));
@ -106,7 +68,6 @@ public final class WidgetUpdateManager {
} }
} }
public static void updateFromState(Context ctx, public static void updateFromState(Context ctx,
String title, String title,
String artist, String artist,
@ -121,6 +82,17 @@ public final class WidgetUpdateManager {
String albumLink, String albumLink,
String artistLink) { String artistLink) {
final Context appCtx = ctx.getApplicationContext(); final Context appCtx = ctx.getApplicationContext();
final String t = TextUtils.isEmpty(title) ? appCtx.getString(R.string.widget_not_playing) : title;
final String a = TextUtils.isEmpty(artist) ? appCtx.getString(R.string.widget_placeholder_subtitle) : artist;
final String alb = !TextUtils.isEmpty(album) ? album : "";
final boolean p = playing;
final boolean sh = shuffleEnabled;
final int rep = repeatMode;
final TimingInfo timing = createTimingInfo(positionMs, durationMs);
final String songLinkFinal = songLink;
final String albumLinkFinal = albumLink;
final String artistLinkFinal = artistLink;
if (!TextUtils.isEmpty(coverArtId)) { if (!TextUtils.isEmpty(coverArtId)) {
CustomGlideRequest.loadAlbumArtBitmap( CustomGlideRequest.loadAlbumArtBitmap(
appCtx, appCtx,
@ -129,24 +101,41 @@ public final class WidgetUpdateManager {
new CustomTarget<Bitmap>() { new CustomTarget<Bitmap>() {
@Override @Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) { public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
updateFromState(ctx, title, artist, album, Optional.of(resource), AppWidgetManager mgr = AppWidgetManager.getInstance(appCtx);
playing, shuffleEnabled, repeatMode, positionMs, durationMs, songLink, albumLink, artistLink); int[] ids = mgr.getAppWidgetIds(new ComponentName(appCtx, WidgetProvider4x1.class));
for (int id : ids) {
android.widget.RemoteViews rv = choosePopulate(appCtx, t, a, alb, resource, p,
timing.elapsedText, timing.totalText, timing.progress, sh, rep, id);
WidgetProvider.attachIntents(appCtx, rv, id, songLinkFinal, albumLinkFinal, artistLinkFinal);
mgr.updateAppWidget(id, rv);
}
} }
@Override @Override
public void onLoadCleared(Drawable placeholder) { public void onLoadCleared(Drawable placeholder) {
updateFromState(ctx, title, artist, album, Optional.empty(), AppWidgetManager mgr = AppWidgetManager.getInstance(appCtx);
playing, shuffleEnabled, repeatMode, positionMs, durationMs, songLink, albumLink, artistLink); int[] ids = mgr.getAppWidgetIds(new ComponentName(appCtx, WidgetProvider4x1.class));
for (int id : ids) {
android.widget.RemoteViews rv = choosePopulate(appCtx, t, a, alb, null, p,
timing.elapsedText, timing.totalText, timing.progress, sh, rep, id);
WidgetProvider.attachIntents(appCtx, rv, id, songLinkFinal, albumLinkFinal, artistLinkFinal);
mgr.updateAppWidget(id, rv);
}
} }
} }
); );
} else { } else {
updateFromState(ctx, title, artist, album, Optional.empty(), AppWidgetManager mgr = AppWidgetManager.getInstance(appCtx);
playing, shuffleEnabled, repeatMode, positionMs, durationMs, songLink, albumLink, artistLink); int[] ids = mgr.getAppWidgetIds(new ComponentName(appCtx, WidgetProvider4x1.class));
for (int id : ids) {
android.widget.RemoteViews rv = choosePopulate(appCtx, t, a, alb, null, p,
timing.elapsedText, timing.totalText, timing.progress, sh, rep, id);
WidgetProvider.attachIntents(appCtx, rv, id, songLinkFinal, albumLinkFinal, artistLinkFinal);
mgr.updateAppWidget(id, rv);
}
} }
} }
@OptIn(markerClass = UnstableApi.class)
public static void refreshFromController(Context ctx) { public static void refreshFromController(Context ctx) {
final Context appCtx = ctx.getApplicationContext(); final Context appCtx = ctx.getApplicationContext();
SessionToken token = new SessionToken(appCtx, new ComponentName(appCtx, MediaService.class)); SessionToken token = new SessionToken(appCtx, new ComponentName(appCtx, MediaService.class));

View file

@ -19,7 +19,7 @@ import com.cappielloantonio.tempo.R;
public final class WidgetViewsFactory { public final class WidgetViewsFactory {
public static final int PROGRESS_MAX = 1000; static final int PROGRESS_MAX = 1000;
private static final float ALBUM_ART_CORNER_RADIUS_DP = 6f; private static final float ALBUM_ART_CORNER_RADIUS_DP = 6f;
private WidgetViewsFactory() { private WidgetViewsFactory() {

View file

@ -4,8 +4,6 @@ import android.app.PendingIntent.FLAG_IMMUTABLE
import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.app.TaskStackBuilder import android.app.TaskStackBuilder
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.Network import android.net.Network
import android.net.NetworkCapabilities import android.net.NetworkCapabilities
@ -13,7 +11,6 @@ import android.os.Binder
import android.os.IBinder import android.os.IBinder
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.text.TextUtils
import android.util.Log import android.util.Log
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.media3.cast.CastPlayer import androidx.media3.cast.CastPlayer
@ -28,10 +25,7 @@ import androidx.media3.exoplayer.DefaultLoadControl
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.session.MediaLibraryService import androidx.media3.session.MediaLibraryService
import androidx.media3.session.MediaSession.ControllerInfo import androidx.media3.session.MediaSession.ControllerInfo
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.cappielloantonio.tempo.repository.AutomotiveRepository import com.cappielloantonio.tempo.repository.AutomotiveRepository
import com.cappielloantonio.tempo.glide.CustomGlideRequest
import com.cappielloantonio.tempo.repository.QueueRepository import com.cappielloantonio.tempo.repository.QueueRepository
import com.cappielloantonio.tempo.ui.activity.MainActivity import com.cappielloantonio.tempo.ui.activity.MainActivity
import com.cappielloantonio.tempo.util.AssetLinkUtil import com.cappielloantonio.tempo.util.AssetLinkUtil
@ -45,7 +39,6 @@ import com.cappielloantonio.tempo.widget.WidgetUpdateManager
import com.google.android.gms.cast.framework.CastContext import com.google.android.gms.cast.framework.CastContext
import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.common.GoogleApiAvailability
import java.util.Optional
@UnstableApi @UnstableApi
class MediaService : MediaLibraryService(), SessionAvailabilityListener { class MediaService : MediaLibraryService(), SessionAvailabilityListener {
@ -56,7 +49,6 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
private lateinit var librarySessionCallback: MediaLibrarySessionCallback private lateinit var librarySessionCallback: MediaLibrarySessionCallback
private lateinit var networkCallback: CustomNetworkCallback private lateinit var networkCallback: CustomNetworkCallback
lateinit var equalizerManager: EqualizerManager lateinit var equalizerManager: EqualizerManager
@Volatile private var artCache : Optional<Optional<Bitmap>> = Optional.empty<Optional<Bitmap>>()
inner class LocalBinder : Binder() { inner class LocalBinder : Binder() {
fun getEqualizerManager(): EqualizerManager { fun getEqualizerManager(): EqualizerManager {
@ -286,7 +278,6 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
} }
override fun onIsPlayingChanged(isPlaying: Boolean) { override fun onIsPlayingChanged(isPlaying: Boolean) {
artCache = Optional.empty()
if (!isPlaying) { if (!isPlaying) {
MediaManager.setPlayingPausedTimestamp( MediaManager.setPlayingPausedTimestamp(
player.currentMediaItem, player.currentMediaItem,
@ -348,16 +339,6 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
} }
} }
private inner class CustomGlideTarget : CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
artCache = Optional.of(Optional.of(resource))
}
override fun onLoadCleared(placeholder: Drawable?) {
artCache = Optional.of(Optional.empty())
}
}
private fun updateWidget() { private fun updateWidget() {
val mi = player.currentMediaItem val mi = player.currentMediaItem
val title = mi?.mediaMetadata?.title?.toString() val title = mi?.mediaMetadata?.title?.toString()
@ -376,21 +357,12 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
?: AssetLinkUtil.buildLink(AssetLinkUtil.TYPE_ARTIST, extras?.getString("artistId")) ?: AssetLinkUtil.buildLink(AssetLinkUtil.TYPE_ARTIST, extras?.getString("artistId"))
val position = player.currentPosition.takeIf { it != C.TIME_UNSET } ?: 0L val position = player.currentPosition.takeIf { it != C.TIME_UNSET } ?: 0L
val duration = player.duration.takeIf { it != C.TIME_UNSET } ?: 0L val duration = player.duration.takeIf { it != C.TIME_UNSET } ?: 0L
if (!TextUtils.isEmpty(coverId) && artCache.isEmpty) {
CustomGlideRequest.loadAlbumArtBitmap(
applicationContext,
coverId,
WidgetUpdateManager.WIDGET_SAFE_ART_SIZE,
CustomGlideTarget())
}
WidgetUpdateManager.updateFromState( WidgetUpdateManager.updateFromState(
this, this,
title ?: "", title ?: "",
artist ?: "", artist ?: "",
album ?: "", album ?: "",
artCache, coverId,
player.isPlaying, player.isPlaying,
player.shuffleModeEnabled, player.shuffleModeEnabled,
player.repeatMode, player.repeatMode,