diff --git a/README.md b/README.md index e66967621..ab13cb949 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ I primarily built Auxio for myself, but you can use it too, I guess. - Improved genre/artist/album UIs - Dedicated search tab -- Swipe-to-next-track function +- Swipe-to-next-track function [Maybe] - Artist Images - Black theme - Custom accents diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index c44d64f87..f37fecc94 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -20,6 +20,7 @@ import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.playback.PlaybackViewModel import org.oxycblt.auxio.ui.Accent +import org.oxycblt.auxio.ui.fixAnimationInfoMemoryLeak import org.oxycblt.auxio.ui.isLandscape import org.oxycblt.auxio.ui.isTablet import org.oxycblt.auxio.ui.toColor @@ -111,6 +112,12 @@ class MainFragment : Fragment() { return binding.root } + override fun onDestroyView() { + super.onDestroyView() + + fixAnimationInfoMemoryLeak() + } + /** * Custom navigator code that has proper animations, unlike BottomNavigationView.setupWithNavController(). */ diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt index 25b4bb5e4..176b1b337 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackService.kt @@ -31,16 +31,14 @@ import com.google.android.exoplayer2.SimpleExoPlayer import com.google.android.exoplayer2.audio.AudioAttributes import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory import com.google.android.exoplayer2.mediacodec.MediaCodecSelector -import com.google.android.exoplayer2.source.DefaultMediaSourceFactory import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.takeWhile import kotlinx.coroutines.launch import org.oxycblt.auxio.coil.getBitmap @@ -349,10 +347,7 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca ) } - val extractorsFactory = DefaultExtractorsFactory().setConstantBitrateSeekingEnabled(true) - return SimpleExoPlayer.Builder(this, audioRenderer) - .setMediaSourceFactory(DefaultMediaSourceFactory(this, extractorsFactory)) .build() } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index bb3bfead5..f48c3cc9b 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -24,6 +24,9 @@ import org.oxycblt.auxio.settings.SettingsManager /** * The ViewModel that provides a UI frontend for [PlaybackStateManager]. + * + * **PLEASE Use this instead of [PlaybackStateManager], UI's are extremely volatile and this provides + * an interface that properly sanitizes input and abstracts functions unlike the master class.** * @author OxygenCobalt */ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { @@ -42,7 +45,6 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback { private val mIsPlaying = MutableLiveData(false) private val mIsShuffling = MutableLiveData(false) private val mLoopMode = MutableLiveData(LoopMode.NONE) - private val mIsInUserQueue = MutableLiveData(false) // Other diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt index 4b115130f..3a806c6dd 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt @@ -107,14 +107,14 @@ class QueueFragment : Fragment() { val queue = mutableListOf() if (playbackModel.userQueue.value!!.isNotEmpty()) { - queue.add(Header(id = 0, name = getString(R.string.label_next_user_queue), isAction = true)) + queue.add(Header(id = -2, name = getString(R.string.label_next_user_queue), isAction = true)) queue.addAll(playbackModel.userQueue.value!!) } if (playbackModel.nextItemsInQueue.value!!.isNotEmpty()) { queue.add( Header( - id = 1, + id = -3, name = getString(R.string.format_next_from, getParentName()), isAction = false ) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index df2faa9f9..d694e4625 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -22,14 +22,13 @@ import org.oxycblt.auxio.settings.SettingsManager * Master class (and possible god object) for the playback state. * * This should ***NOT*** be used outside of the playback module. - * - If you want to use the playback state in the UI, use [org.oxycblt.auxio.playback.PlaybackViewModel]. - * - If you want to use the playback state with the ExoPlayer instance or system-side things, - * use [org.oxycblt.auxio.playback.PlaybackService]. + * - If you want to use the playback state in the UI, use [org.oxycblt.auxio.playback.PlaybackViewModel] as it can withstand volatile UIs. + * - If you want to use the playback state with the ExoPlayer instance or system-side things, use [org.oxycblt.auxio.playback.PlaybackService]. * * All access should be done with [PlaybackStateManager.getInstance]. - * @author OxygenCobalt * - * TODO: Sort queues + * TODO: Queues should reflect sort mode + * @author OxygenCobalt */ class PlaybackStateManager private constructor() { // Playback diff --git a/app/src/main/java/org/oxycblt/auxio/search/SearchViewModel.kt b/app/src/main/java/org/oxycblt/auxio/search/SearchViewModel.kt index 8b2ee3d36..e38615394 100644 --- a/app/src/main/java/org/oxycblt/auxio/search/SearchViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/search/SearchViewModel.kt @@ -51,28 +51,28 @@ class SearchViewModel : ViewModel() { if (mFilterMode.isAllOr(DisplayMode.SHOW_ARTISTS)) { musicStore.artists.filterByOrNull(query)?.let { - results.add(Header(id = -1, name = context.getString(R.string.label_artists))) + results.add(Header(id = -2, name = context.getString(R.string.label_artists))) results.addAll(it) } } if (mFilterMode.isAllOr(DisplayMode.SHOW_ALBUMS)) { musicStore.albums.filterByOrNull(query)?.let { - results.add(Header(id = -2, name = context.getString(R.string.label_albums))) + results.add(Header(id = -3, name = context.getString(R.string.label_albums))) results.addAll(it) } } if (mFilterMode.isAllOr(DisplayMode.SHOW_GENRES)) { musicStore.genres.filterByOrNull(query)?.let { - results.add(Header(id = -3, name = context.getString(R.string.label_genres))) + results.add(Header(id = -4, name = context.getString(R.string.label_genres))) results.addAll(it) } } if (mFilterMode.isAllOr(DisplayMode.SHOW_SONGS)) { musicStore.songs.filterByOrNull(query)?.let { - results.add(Header(id = -4, name = context.getString(R.string.label_songs))) + results.add(Header(id = -5, name = context.getString(R.string.label_songs))) results.addAll(it) } }