From 0a8fea844860ab5e643576d36f250e26e63befdb Mon Sep 17 00:00:00 2001 From: Charlotte Van Petegem Date: Sat, 18 Oct 2025 22:50:11 +0200 Subject: [PATCH] Do a bunch of code cleanup --- .gitignore | 9 +-- app/build.gradle.kts | 7 +- .../java/me/vanpetegem/accentor/Accentor.kt | 1 - .../accentor/data/albums/AlbumDao.kt | 14 ++-- .../accentor/data/albums/AlbumRepository.kt | 8 +- .../accentor/data/artists/ArtistRepository.kt | 6 +- .../AuthenticationDataSource.kt | 80 +++++++++---------- .../AuthenticationRepository.kt | 2 +- .../CodecConversionRepository.kt | 2 +- .../accentor/data/playlists/Playlist.kt | 2 +- .../data/playlists/PlaylistRepository.kt | 4 +- .../accentor/data/plays/PlayRepository.kt | 8 +- .../vanpetegem/accentor/data/tracks/Track.kt | 4 - .../accentor/data/tracks/TrackDao.kt | 4 +- .../accentor/data/tracks/TrackRepository.kt | 4 +- .../accentor/data/users/UserRepository.kt | 2 +- .../accentor/media/MediaSessionConnection.kt | 61 ++++++-------- .../vanpetegem/accentor/media/MusicService.kt | 22 +++-- .../vanpetegem/accentor/ui/AccentorTheme.kt | 2 - .../accentor/ui/albums/AlbumCard.kt | 4 +- .../accentor/ui/albums/AlbumView.kt | 5 +- .../accentor/ui/albums/AlbumViewModel.kt | 2 +- .../accentor/ui/albums/AlbumsViewModel.kt | 8 +- .../accentor/ui/artists/ArtistCard.kt | 2 +- .../accentor/ui/artists/ArtistView.kt | 5 +- .../accentor/ui/artists/ArtistViewModel.kt | 4 +- .../accentor/ui/artists/ArtistsViewModel.kt | 8 +- .../accentor/ui/home/HomeFragment.kt | 16 ++-- .../accentor/ui/home/HomeViewModel.kt | 4 +- .../accentor/ui/login/LoginActivity.kt | 2 +- .../accentor/ui/login/LoginViewModel.kt | 6 +- .../accentor/ui/main/MainViewModel.kt | 4 +- .../vanpetegem/accentor/ui/player/Controls.kt | 2 +- .../accentor/ui/player/PlayerOverlay.kt | 3 +- .../accentor/ui/player/PlayerViewModel.kt | 42 +++++----- .../accentor/ui/playlists/PlaylistView.kt | 1 - .../ui/playlists/PlaylistViewModel.kt | 6 +- .../ui/playlists/PlaylistsViewModel.kt | 10 +-- .../ui/preferences/PreferencesViewModel.kt | 4 +- .../me/vanpetegem/accentor/ui/util/Event.kt | 2 - .../me/vanpetegem/accentor/ui/util/Timer.kt | 2 - .../accentor/util/SharedPreferenceLiveData.kt | 34 -------- app/src/main/res/ic_launcher.svg | 35 +------- flake.nix | 13 ++- gradle/libs.versions.toml | 5 -- 45 files changed, 184 insertions(+), 287 deletions(-) diff --git a/.gitignore b/.gitignore index c34ddb3e..f1534cd4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,9 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml .DS_Store /build +/.kotlin /captures .externalNativeBuild -keystore.jks \ No newline at end of file +keystore.jks diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5c228808..97e8646e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -21,9 +21,6 @@ android { versionName = "0.18.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - ksp { - arg("room.schemaLocation", "$projectDir/schemas".toString()) - } } buildFeatures { @@ -56,6 +53,10 @@ android { } } + ksp { + arg("room.schemaLocation", "$projectDir/schemas") + } + lint { quiet = true disable.addAll( diff --git a/app/src/main/java/me/vanpetegem/accentor/Accentor.kt b/app/src/main/java/me/vanpetegem/accentor/Accentor.kt index 75e130e3..fabc8824 100644 --- a/app/src/main/java/me/vanpetegem/accentor/Accentor.kt +++ b/app/src/main/java/me/vanpetegem/accentor/Accentor.kt @@ -12,7 +12,6 @@ import coil.disk.DiskCache import com.github.kittinunf.fuel.core.FuelManager import com.google.android.material.color.DynamicColors import dagger.hilt.android.HiltAndroidApp -import me.vanpetegem.accentor.BuildConfig import me.vanpetegem.accentor.data.preferences.PreferencesDataSource import org.acra.config.dialog import org.acra.config.mailSender diff --git a/app/src/main/java/me/vanpetegem/accentor/data/albums/AlbumDao.kt b/app/src/main/java/me/vanpetegem/accentor/data/albums/AlbumDao.kt index 302c8fb1..fb3b9b29 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/albums/AlbumDao.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/albums/AlbumDao.kt @@ -106,12 +106,12 @@ abstract class AlbumDao { @Query( """ - SELECT * FROM albums WHERE release LIKE '%' || :day || '%' - ORDER BY release DESC, - normalized_title ASC, - edition ASC, - edition_description ASC, - id ASC + SELECT * FROM albums WHERE `release` LIKE '%' || :day || '%' + ORDER BY `release` DESC, + `normalized_title` ASC, + `edition` ASC, + `edition_description` ASC, + `id` ASC """, ) protected abstract fun findDbAlbumsByDay(day: String): LiveData> @@ -227,7 +227,7 @@ abstract class AlbumDao { } } - @Query("SELECT * FROM albums ORDER BY normalized_title ASC, release ASC, edition ASC, edition_description ASC, id ASC") + @Query("SELECT * FROM albums ORDER BY `normalized_title` ASC, `release` ASC, `edition` ASC, `edition_description` ASC, `id` ASC") protected abstract fun getAllDbAlbums(): LiveData> @RewriteQueriesToDropUnusedColumns diff --git a/app/src/main/java/me/vanpetegem/accentor/data/albums/AlbumRepository.kt b/app/src/main/java/me/vanpetegem/accentor/data/albums/AlbumRepository.kt index 4ee5d684..792040d5 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/albums/AlbumRepository.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/albums/AlbumRepository.kt @@ -28,13 +28,13 @@ class AlbumRepository val albumsByReleased: LiveData> = allAlbums.map { val copy = it.toMutableList() - copy.sortWith({ a1, a2 -> a2.release.compareTo(a1.release) }) + copy.sortWith { a1, a2 -> a2.release.compareTo(a1.release) } copy } val albumsByAdded: LiveData> = allAlbums.map { val copy = it.toMutableList() - copy.sortWith({ a1, a2 -> a2.createdAt.compareTo(a1.createdAt) }) + copy.sortWith { a1, a2 -> a2.createdAt.compareTo(a1.createdAt) } copy } val albumsByPlayed: LiveData> = albumDao.getAllByPlayed() @@ -58,7 +58,7 @@ class AlbumRepository suspend fun refresh(handler: suspend (Result) -> Unit) { val fetchStart = Instant.now() - var toUpsert = ArrayList() + val toUpsert = ArrayList() var count = 0 for (result in index(authenticationRepository.server.value!!, authenticationRepository.authData.value!!)) { when (result) { @@ -83,7 +83,7 @@ class AlbumRepository handler(Result.Success(Unit)) } - suspend fun clear() { + fun clear() { albumDao.deleteAll() } } diff --git a/app/src/main/java/me/vanpetegem/accentor/data/artists/ArtistRepository.kt b/app/src/main/java/me/vanpetegem/accentor/data/artists/ArtistRepository.kt index 69baeb92..04eec21c 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/artists/ArtistRepository.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/artists/ArtistRepository.kt @@ -27,7 +27,7 @@ class ArtistRepository val artistsByAdded: LiveData> = allArtists.map { val copy = it.toMutableList() - copy.sortWith({ a1, a2 -> a2.createdAt.compareTo(a1.createdAt) }) + copy.sortWith { a1, a2 -> a2.createdAt.compareTo(a1.createdAt) } copy } val artistsByPlayed: LiveData> = artistDao.getAllByPlayed() @@ -41,7 +41,7 @@ class ArtistRepository suspend fun refresh(handler: suspend (Result) -> Unit) { val fetchStart = Instant.now() - var toUpsert = ArrayList() + val toUpsert = ArrayList() var count = 0 for (result in index(authenticationRepository.server.value!!, authenticationRepository.authData.value!!)) { when (result) { @@ -66,7 +66,7 @@ class ArtistRepository handler(Result.Success(Unit)) } - suspend fun clear() { + fun clear() { artistDao.deleteAll() } } diff --git a/app/src/main/java/me/vanpetegem/accentor/data/authentication/AuthenticationDataSource.kt b/app/src/main/java/me/vanpetegem/accentor/data/authentication/AuthenticationDataSource.kt index 192c4c87..b90e9bd8 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/authentication/AuthenticationDataSource.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/authentication/AuthenticationDataSource.kt @@ -29,52 +29,48 @@ class AuthenticationDataSource private val serverData = sharedPreferences.stringLiveData(SERVER_KEY) - val authData: LiveData - val server: LiveData = serverData - - init { - authData = - MediatorLiveData().apply { - val observer: Observer = - Observer { - val id: Int = - idData.value.let { - if (it != null) { - it - } else { - value = null - return@Observer - } + val authData: LiveData = + MediatorLiveData().apply { + val observer: Observer = + Observer { + val id: Int = + idData.value.let { + if (it != null) { + it + } else { + value = null + return@Observer } - val userId: Int = - userIdData.value.let { - if (it != null) { - it - } else { - value = null - return@Observer - } + } + val userId: Int = + userIdData.value.let { + if (it != null) { + it + } else { + value = null + return@Observer } - val token: String = - tokenData.value.let { - if (it != null) { - it - } else { - value = null - return@Observer - } + } + val token: String = + tokenData.value.let { + if (it != null) { + it + } else { + value = null + return@Observer } - val newVal = AuthenticationData(id, userId, token) - if (newVal != this.value) this.value = newVal - } + } + val newVal = AuthenticationData(id, userId, token) + if (newVal != this.value) this.value = newVal + } - addSource(idData, observer) - addSource(userIdData, observer) - addSource(tokenData, observer) - // If we don't do this, the value will start out as null even if we have data in the prefs. - observer.onChanged(null) - } - } + addSource(idData, observer) + addSource(userIdData, observer) + addSource(tokenData, observer) + // If we don't do this, the value will start out as null even if we have data in the prefs. + observer.onChanged(null) + } + val server: LiveData = serverData fun setAuthData(authData: AuthenticationData?) { if (authData == null) { diff --git a/app/src/main/java/me/vanpetegem/accentor/data/authentication/AuthenticationRepository.kt b/app/src/main/java/me/vanpetegem/accentor/data/authentication/AuthenticationRepository.kt index d77ba5f6..60d0e3ce 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/authentication/AuthenticationRepository.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/authentication/AuthenticationRepository.kt @@ -30,7 +30,7 @@ class AuthenticationRepository } } - suspend fun login( + fun login( server: String, username: String, password: String, diff --git a/app/src/main/java/me/vanpetegem/accentor/data/codecconversions/CodecConversionRepository.kt b/app/src/main/java/me/vanpetegem/accentor/data/codecconversions/CodecConversionRepository.kt index d189005b..1ea445b2 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/codecconversions/CodecConversionRepository.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/codecconversions/CodecConversionRepository.kt @@ -46,7 +46,7 @@ class CodecConversionRepository handler(Result.Success(Unit)) } - suspend fun clear() { + fun clear() { codecConversionDao.deleteAll() } } diff --git a/app/src/main/java/me/vanpetegem/accentor/data/playlists/Playlist.kt b/app/src/main/java/me/vanpetegem/accentor/data/playlists/Playlist.kt index a2278c4f..74cfd624 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/playlists/Playlist.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/playlists/Playlist.kt @@ -81,7 +81,7 @@ data class Playlist( albumMap.put(it.albumId, albumRepository.getById(it.albumId)!!) } } - tracks.sortWith({ t1, t2 -> t1.compareAlphabetically(t2, albumMap) }) + tracks.sortWith { t1, t2 -> t1.compareAlphabetically(t2, albumMap) } tracks.map { Pair(it, albumMap.get(it.albumId)) } } } diff --git a/app/src/main/java/me/vanpetegem/accentor/data/playlists/PlaylistRepository.kt b/app/src/main/java/me/vanpetegem/accentor/data/playlists/PlaylistRepository.kt index 3e575e30..a09a225d 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/playlists/PlaylistRepository.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/playlists/PlaylistRepository.kt @@ -28,7 +28,7 @@ class PlaylistRepository suspend fun refresh(handler: suspend (Result) -> Unit) { val fetchStart = Instant.now() - var toUpsert = ArrayList() + val toUpsert = ArrayList() var count = 0 for (result in index(authenticationRepository.server.value!!, authenticationRepository.authData.value!!)) { when (result) { @@ -53,7 +53,7 @@ class PlaylistRepository handler(Result.Success(Unit)) } - suspend fun clear() { + fun clear() { playlistDao.deleteAll() } } diff --git a/app/src/main/java/me/vanpetegem/accentor/data/plays/PlayRepository.kt b/app/src/main/java/me/vanpetegem/accentor/data/plays/PlayRepository.kt index afffffce..7988a9e8 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/plays/PlayRepository.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/plays/PlayRepository.kt @@ -18,7 +18,7 @@ class PlayRepository suspend fun refresh(handler: suspend (Result) -> Unit) { val fetchStart = Instant.now() - var toUpsert = ArrayList() + val toUpsert = ArrayList() var count = 0 for (result in index(authenticationRepository.server.value!!, authenticationRepository.authData.value!!)) { when (result) { @@ -44,7 +44,7 @@ class PlayRepository handler(Result.Success(Unit)) } - private suspend fun reportUnreportedPlays() { + private fun reportUnreportedPlays() { for (play in unreportedPlayDao.getAllUnreportedPlays()) { when (val result = create(authenticationRepository.server.value!!, authenticationRepository.authData.value!!, play.trackId, play.playedAt)) { is CreateResult.Success -> { @@ -63,7 +63,7 @@ class PlayRepository } } - suspend fun reportPlay( + fun reportPlay( trackId: Int, playedAt: Instant, ) { @@ -82,7 +82,7 @@ class PlayRepository } } - suspend fun clear() { + fun clear() { playDao.deleteAll() } } diff --git a/app/src/main/java/me/vanpetegem/accentor/data/tracks/Track.kt b/app/src/main/java/me/vanpetegem/accentor/data/tracks/Track.kt index f7d0ba7d..ce22b0c9 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/tracks/Track.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/tracks/Track.kt @@ -61,10 +61,6 @@ data class Track( } companion object { - const val ALBUMARTIST = "me.vanpetegem.accentor.data.tracks.Track.ALBUMARTIST" - const val ARTIST = "me.vanpetegem.accentor.data.tracks.Track.ARTIST" - const val YEAR = "me.vanpetegem.accentor.data.tracks.Track.YEAR" - fun fromDb( t: DbTrack, trackArtists: List, diff --git a/app/src/main/java/me/vanpetegem/accentor/data/tracks/TrackDao.kt b/app/src/main/java/me/vanpetegem/accentor/data/tracks/TrackDao.kt index 0ce8e298..075a4657 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/tracks/TrackDao.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/tracks/TrackDao.kt @@ -49,8 +49,8 @@ abstract class TrackDao { dbTrack?.let { Track.fromDb( it, - trackArtists.map { TrackArtist(it.artistId, it.name, it.normalizedName, it.role, it.order, it.hidden) }, - trackGenres.map { it.genreId }, + trackArtists.map { ta -> TrackArtist(ta.artistId, ta.name, ta.normalizedName, ta.role, ta.order, ta.hidden) }, + trackGenres.map { tg -> tg.genreId }, ) } } diff --git a/app/src/main/java/me/vanpetegem/accentor/data/tracks/TrackRepository.kt b/app/src/main/java/me/vanpetegem/accentor/data/tracks/TrackRepository.kt index b100802c..f5ac3e22 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/tracks/TrackRepository.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/tracks/TrackRepository.kt @@ -36,7 +36,7 @@ class TrackRepository suspend fun refresh(handler: suspend (Result) -> Unit) { val fetchStart = Instant.now() - var toUpsert = ArrayList() + val toUpsert = ArrayList() var count = 0 for (result in index(authenticationRepository.server.value!!, authenticationRepository.authData.value!!)) { when (result) { @@ -61,7 +61,7 @@ class TrackRepository handler(Result.Success(Unit)) } - suspend fun clear() { + fun clear() { trackDao.deleteAll() } } diff --git a/app/src/main/java/me/vanpetegem/accentor/data/users/UserRepository.kt b/app/src/main/java/me/vanpetegem/accentor/data/users/UserRepository.kt index f8f93524..2ca19f02 100644 --- a/app/src/main/java/me/vanpetegem/accentor/data/users/UserRepository.kt +++ b/app/src/main/java/me/vanpetegem/accentor/data/users/UserRepository.kt @@ -49,7 +49,7 @@ class UserRepository handler(Result.Success(Unit)) } - suspend fun clear() { + fun clear() { userDao.deleteAll() } } diff --git a/app/src/main/java/me/vanpetegem/accentor/media/MediaSessionConnection.kt b/app/src/main/java/me/vanpetegem/accentor/media/MediaSessionConnection.kt index 1633dd93..8525f15f 100644 --- a/app/src/main/java/me/vanpetegem/accentor/media/MediaSessionConnection.kt +++ b/app/src/main/java/me/vanpetegem/accentor/media/MediaSessionConnection.kt @@ -19,10 +19,7 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import me.vanpetegem.accentor.data.albums.Album import me.vanpetegem.accentor.data.albums.AlbumRepository -import me.vanpetegem.accentor.data.authentication.AuthenticationDataSource -import me.vanpetegem.accentor.data.codecconversions.CodecConversionRepository import me.vanpetegem.accentor.data.playlists.Playlist -import me.vanpetegem.accentor.data.preferences.PreferencesDataSource import me.vanpetegem.accentor.data.tracks.Track import me.vanpetegem.accentor.data.tracks.TrackRepository import javax.inject.Inject @@ -32,12 +29,9 @@ import javax.inject.Singleton class MediaSessionConnection @Inject constructor( - private val application: Application, + application: Application, private val albumRepository: AlbumRepository, private val trackRepository: TrackRepository, - private val preferencesDataSource: PreferencesDataSource, - private val codecConversionRepository: CodecConversionRepository, - private val authenticationDataSource: AuthenticationDataSource, ) { private val mainScope = MainScope() private val mediaControllerFuture: ListenableFuture = @@ -54,7 +48,7 @@ class MediaSessionConnection val currentTrack: LiveData = currentTrackId.switchMap { id -> _queue.switchMap { queue -> - if (queue.size > 0) id?.let { trackRepository.findById(id) } else null + if (queue.isNotEmpty()) id?.let { trackRepository.findById(id) } else null } } val currentAlbum: LiveData = @@ -153,14 +147,7 @@ class MediaSessionConnection mediaController.addListener(listener) } - suspend fun stop() { - mainScope.launch(Main) { - mediaController.stop() - mediaController.clearMediaItems() - } - } - - suspend fun play(tracks: List>) { + fun play(tracks: List>) { mainScope.launch(Main) { mediaController.stop() mediaController.clearMediaItems() @@ -170,28 +157,28 @@ class MediaSessionConnection } } - suspend fun play(album: Album) { + fun play(album: Album) { val tracks = trackRepository.getByAlbum(album).map { Pair(it, album) } play(tracks) } - suspend fun play(playlist: Playlist) { + fun play(playlist: Playlist) { val tracks = playlist.toTrackAlbumPairs(trackRepository, albumRepository) play(tracks) } - suspend fun play(track: Track) { + fun play(track: Track) { val album = albumRepository.getById(track.albumId) album?.let { play(listOf(Pair(track, it))) } } - suspend fun addTrackToQueue(track: Track): Unit = addTrackToQueue(track, _queue.value?.size ?: 0) + fun addTrackToQueue(track: Track): Unit = addTrackToQueue(track, _queue.value?.size ?: 0) - suspend fun addTracksToQueue(album: Album): Unit = addTracksToQueue(album, _queue.value?.size ?: 0) + fun addTracksToQueue(album: Album): Unit = addTracksToQueue(album, _queue.value?.size ?: 0) - suspend fun addTracksToQueue(playlist: Playlist): Unit = addTracksToQueue(playlist, _queue.value?.size ?: 0) + fun addTracksToQueue(playlist: Playlist): Unit = addTracksToQueue(playlist, _queue.value?.size ?: 0) - suspend fun addTrackToQueue( + fun addTrackToQueue( track: Track, index: Int, ) { @@ -199,7 +186,7 @@ class MediaSessionConnection album?.let { addTracksToQueue(listOf(Pair(track, album)), index) } } - suspend fun addTracksToQueue( + fun addTracksToQueue( album: Album, index: Int, ) { @@ -207,7 +194,7 @@ class MediaSessionConnection addTracksToQueue(tracks, index) } - suspend fun addTracksToQueue( + fun addTracksToQueue( playlist: Playlist, index: Int, ) { @@ -215,9 +202,9 @@ class MediaSessionConnection addTracksToQueue(tracks, index) } - suspend fun clearQueue() = mainScope.launch(Main) { mediaController.clearMediaItems() } + fun clearQueue() = mainScope.launch(Main) { mediaController.clearMediaItems() } - suspend fun addTracksToQueue( + fun addTracksToQueue( tracks: List>, index: Int, ) { @@ -226,32 +213,32 @@ class MediaSessionConnection } } - suspend fun previous() = mainScope.launch(Main) { mediaController.seekToPrevious() } + fun previous() = mainScope.launch(Main) { mediaController.seekToPrevious() } - suspend fun pause() = mainScope.launch(Main) { mediaController.pause() } + fun pause() = mainScope.launch(Main) { mediaController.pause() } - suspend fun play() = + fun play() = mainScope.launch(Main) { mediaController.prepare() mediaController.play() } - suspend fun next() = mainScope.launch(Main) { mediaController.seekToNext() } + fun next() = mainScope.launch(Main) { mediaController.seekToNext() } - suspend fun seekTo(time: Int) = mainScope.launch(Main) { mediaController.seekTo(time.toLong() * 1000) } + fun seekTo(time: Int) = mainScope.launch(Main) { mediaController.seekTo(time.toLong() * 1000) } - suspend fun setRepeatMode(repeatMode: Int) = mainScope.launch(Main) { mediaController.setRepeatMode(repeatMode) } + fun setRepeatMode(repeatMode: Int) = mainScope.launch(Main) { mediaController.setRepeatMode(repeatMode) } - suspend fun setShuffleMode(shuffleMode: Boolean) = mainScope.launch(Main) { mediaController.setShuffleModeEnabled(shuffleMode) } + fun setShuffleMode(shuffleMode: Boolean) = mainScope.launch(Main) { mediaController.setShuffleModeEnabled(shuffleMode) } - suspend fun updateCurrentPosition() = + fun updateCurrentPosition() = mainScope.launch(Main) { _currentPosition.postValue(mediaController.currentPosition) } - suspend fun skipTo(position: Int) = mainScope.launch(Main) { mediaController.seekToDefaultPosition(position) } + fun skipTo(position: Int) = mainScope.launch(Main) { mediaController.seekToDefaultPosition(position) } - suspend fun removeFromQueue(position: Int) = mainScope.launch(Main) { mediaController.removeMediaItem(position) } + fun removeFromQueue(position: Int) = mainScope.launch(Main) { mediaController.removeMediaItem(position) } private fun convertTrack(track: Track): MediaItem = MediaItem.Builder().setMediaId(track.id.toString()).build() } diff --git a/app/src/main/java/me/vanpetegem/accentor/media/MusicService.kt b/app/src/main/java/me/vanpetegem/accentor/media/MusicService.kt index d6e22f7b..069c2aeb 100644 --- a/app/src/main/java/me/vanpetegem/accentor/media/MusicService.kt +++ b/app/src/main/java/me/vanpetegem/accentor/media/MusicService.kt @@ -10,7 +10,6 @@ import androidx.media3.common.MediaItem import androidx.media3.common.MediaMetadata import androidx.media3.common.Player import androidx.media3.database.StandaloneDatabaseProvider -import androidx.media3.datasource.DataSource import androidx.media3.datasource.DefaultDataSource import androidx.media3.datasource.DefaultHttpDataSource import androidx.media3.datasource.cache.CacheDataSource @@ -85,13 +84,12 @@ class MusicService : MediaSessionService() { .Builder(this) .setMediaSourceFactory( ProgressiveMediaSource.Factory( - object : DataSource.Factory { - override fun createDataSource(): DataSource = - CacheDataSource( - cache, - baseDataSourceFactory.createDataSource(), - (CacheDataSource.FLAG_BLOCK_ON_CACHE or CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR), - ) + { + CacheDataSource( + cache, + baseDataSourceFactory.createDataSource(), + (CacheDataSource.FLAG_BLOCK_ON_CACHE or CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR), + ) }, DefaultExtractorsFactory().setConstantBitrateSeekingEnabled(true), ), @@ -187,13 +185,13 @@ class MusicService : MediaSessionService() { override fun onGetSession(info: MediaSession.ControllerInfo): MediaSession? = mediaSession - private suspend fun convertTracks(items: List): List { + private fun convertTracks(items: List): List { val converted = items.map { convertTrack(it.mediaId.toInt()) } val filtered = converted.filterNotNull() return filtered } - private suspend fun convertTrack(id: Int): MediaItem? { + private fun convertTrack(id: Int): MediaItem? { val track = trackRepository.getById(id) ?: return null val album = track.let { albumRepository.getById(it.albumId) } ?: return null @@ -212,8 +210,8 @@ class MusicService : MediaSessionService() { .setTitle(track.title) .setArtist(track.stringifyTrackArtists()) .setAlbumTitle(album.title) - .setAlbumArtist(album.stringifyAlbumArtists().let { if (it.isEmpty()) application.getString(R.string.various_artists) else it }) - .setArtworkUri(album.image500?.let { it.toUri() }) + .setAlbumArtist(album.stringifyAlbumArtists().let { it.ifEmpty { application.getString(R.string.various_artists) } }) + .setArtworkUri(album.image500?.toUri()) .setTrackNumber(track.number) .setReleaseYear(album.release.year) .setReleaseMonth(album.release.monthValue) diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/AccentorTheme.kt b/app/src/main/java/me/vanpetegem/accentor/ui/AccentorTheme.kt index c8f88564..05dacb70 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/AccentorTheme.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/AccentorTheme.kt @@ -38,7 +38,6 @@ val md_theme_light_outline = Color(0xFF73777F) val md_theme_light_inverseOnSurface = Color(0xFFF1F0F4) val md_theme_light_inverseSurface = Color(0xFF2F3033) val md_theme_light_inversePrimary = Color(0xFF9ECAFF) -val md_theme_light_shadow = Color(0xFF000000) val md_theme_light_surfaceTint = Color(0xFF0061A4) val md_theme_dark_primary = Color(0xFF9ECAFF) @@ -67,7 +66,6 @@ val md_theme_dark_outline = Color(0xFF8D9199) val md_theme_dark_inverseOnSurface = Color(0xFF1A1C1E) val md_theme_dark_inverseSurface = Color(0xFFE2E2E6) val md_theme_dark_inversePrimary = Color(0xFF0061A4) -val md_theme_dark_shadow = Color(0xFF000000) val md_theme_dark_surfaceTint = Color(0xFF9ECAFF) private val LightColors = diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumCard.kt b/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumCard.kt index 3441b1cb..0ce89afe 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumCard.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumCard.kt @@ -42,7 +42,7 @@ import me.vanpetegem.accentor.data.albums.Album import me.vanpetegem.accentor.ui.player.PlayerViewModel @Composable -public fun AlbumCard( +fun AlbumCard( album: Album, navController: NavController, playerViewModel: PlayerViewModel, @@ -70,7 +70,7 @@ public fun AlbumCard( ) Text( album.stringifyAlbumArtists().let { - if (it.isEmpty()) stringResource(R.string.various_artists) else it + it.ifEmpty { stringResource(R.string.various_artists) } }, maxLines = 1, modifier = Modifier.padding(bottom = 4.dp, start = 4.dp, end = 4.dp), diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumView.kt b/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumView.kt index 8f654f13..b14f9cdc 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumView.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumView.kt @@ -16,7 +16,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -66,7 +65,7 @@ fun AlbumView( overflow = TextOverflow.Ellipsis, ) Text( - album.stringifyAlbumArtists().let { if (it.isEmpty()) stringResource(R.string.various_artists) else it }, + album.stringifyAlbumArtists().let { it.ifEmpty { stringResource(R.string.various_artists) } }, style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Normal, modifier = Modifier.padding(start = 8.dp), @@ -92,7 +91,7 @@ fun AlbumView( } } } - if (tracks != null && tracks!!.size > 0) { + if (tracks != null && tracks!!.isNotEmpty()) { items(tracks!!.size) { i -> TrackRow(tracks!![i], navController, playerViewModel, hideAlbum = true) } } } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumViewModel.kt index 86bdee49..81f1dab8 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumViewModel.kt @@ -27,7 +27,7 @@ class AlbumViewModel fun tracksForAlbum(album: Album): LiveData> = trackRepository.findByAlbum(album).map { tracks -> val copy = tracks.toMutableList() - copy.sortWith({ t1, t2 -> t1.number.compareTo(t2.number) }) + copy.sortWith { t1, t2 -> t1.number.compareTo(t2.number) } copy } } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumsViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumsViewModel.kt index 0eed7ef6..bba77dd5 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumsViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/albums/AlbumsViewModel.kt @@ -17,20 +17,20 @@ class AlbumsViewModel @Inject constructor( application: Application, - private val albumRepository: AlbumRepository, + albumRepository: AlbumRepository, ) : AndroidViewModel(application) { val allAlbums: LiveData> = albumRepository.allAlbums - private val _searching = MutableLiveData(false) + private val _searching = MutableLiveData(false) val searching: LiveData = _searching - private val _query = MutableLiveData("") + private val _query = MutableLiveData("") val query: LiveData = _query val filteredAlbums: LiveData> = allAlbums.switchMap { albums -> query.map { query -> - if (query.equals("")) { + if (query == "") { albums } else { albums.filter { a -> a.normalizedTitle.contains(Normalizer.normalize(query, Normalizer.Form.NFKD), ignoreCase = true) } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistCard.kt b/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistCard.kt index 4ab7b090..4f1d30cc 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistCard.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistCard.kt @@ -20,7 +20,7 @@ import me.vanpetegem.accentor.R import me.vanpetegem.accentor.data.artists.Artist @Composable -public fun ArtistCard( +fun ArtistCard( navController: NavController, artist: Artist, ) { diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistView.kt b/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistView.kt index 80b57c75..e3b51ab8 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistView.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistView.kt @@ -14,7 +14,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -57,7 +56,7 @@ fun ArtistView( } } item { - if (albums != null && albums!!.size > 0) { + if (albums != null && albums!!.isNotEmpty()) { Text(stringResource(R.string.albums), style = MaterialTheme.typography.headlineMedium, modifier = Modifier.padding(8.dp)) LazyRow { items(albums!!.size) { i -> @@ -68,7 +67,7 @@ fun ArtistView( } } } - if (tracks != null && tracks!!.size > 0) { + if (tracks != null && tracks!!.isNotEmpty()) { item { Text(stringResource(R.string.tracks), style = MaterialTheme.typography.headlineMedium, modifier = Modifier.padding(8.dp)) } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistViewModel.kt index e702c022..d09c1a4b 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistViewModel.kt @@ -30,7 +30,7 @@ class ArtistViewModel fun albumsForArtist(artist: Artist): LiveData> = albumRepository.albumsByReleased.map { albums -> - val result = albums.filter { it.albumArtists.any { it.artistId == artist.id } }.toMutableList() + val result = albums.filter { album -> album.albumArtists.any { aa -> aa.artistId == artist.id } }.toMutableList() result.reverse() result } @@ -39,7 +39,7 @@ class ArtistViewModel trackRepository.findByArtist(artist).switchMap { tracks -> albumRepository.allAlbumsById.map { albums -> val copy = tracks.toMutableList() - copy.sortWith({ t1, t2 -> t1.compareAlphabetically(t2, albums) }) + copy.sortWith { t1, t2 -> t1.compareAlphabetically(t2, albums) } copy } } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistsViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistsViewModel.kt index c7236718..ca684808 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistsViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/artists/ArtistsViewModel.kt @@ -17,20 +17,20 @@ class ArtistsViewModel @Inject constructor( application: Application, - private val artistRepository: ArtistRepository, + artistRepository: ArtistRepository, ) : AndroidViewModel(application) { val allArtists: LiveData> = artistRepository.allArtists - private val _searching = MutableLiveData(false) + private val _searching = MutableLiveData(false) val searching: LiveData = _searching - private val _query = MutableLiveData("") + private val _query = MutableLiveData("") val query: LiveData = _query val filteredArtists: LiveData> = allArtists.switchMap { artists -> query.map { query -> - if (query.equals("")) { + if (query == "") { artists } else { artists.filter { a -> a.normalizedName.contains(Normalizer.normalize(query, Normalizer.Form.NFKD), ignoreCase = true) } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/home/HomeFragment.kt b/app/src/main/java/me/vanpetegem/accentor/ui/home/HomeFragment.kt index 24f0cabc..70189b63 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/home/HomeFragment.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/home/HomeFragment.kt @@ -32,7 +32,7 @@ fun Home( item { val albums by homeViewModel.recentlyReleasedAlbums.observeAsState() Text(stringResource(R.string.recently_released), style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(8.dp)) - if (albums != null && albums!!.size > 0) { + if (albums != null && albums!!.isNotEmpty()) { LazyRow { items(albums!!.size) { i -> Box(modifier = Modifier.width(192.dp)) { @@ -47,7 +47,7 @@ fun Home( item { val albums by homeViewModel.recentlyAddedAlbums.observeAsState() Text(stringResource(R.string.recently_added_albums), style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(8.dp)) - if (albums != null && albums!!.size > 0) { + if (albums != null && albums!!.isNotEmpty()) { LazyRow { items(albums!!.size) { i -> Box(modifier = Modifier.width(192.dp)) { @@ -66,7 +66,7 @@ fun Home( val currentDay by homeViewModel.currentDay.observeAsState() val albums by homeViewModel.albumsForDay(currentDay!!).observeAsState() Text(stringResource(R.string.on_this_day), style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(8.dp)) - if (albums != null && albums!!.size > 0) { + if (albums != null && albums!!.isNotEmpty()) { LazyRow { items(albums!!.size) { i -> Box(modifier = Modifier.width(192.dp)) { @@ -81,7 +81,7 @@ fun Home( item { val albums by homeViewModel.recentlyPlayedAlbums.observeAsState() Text(stringResource(R.string.recently_played_albums), style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(8.dp)) - if (albums != null && albums!!.size > 0) { + if (albums != null && albums!!.isNotEmpty()) { LazyRow { items(albums!!.size) { i -> Box(modifier = Modifier.width(192.dp)) { @@ -96,7 +96,7 @@ fun Home( item { val artists by homeViewModel.recentlyAddedArtists.observeAsState() Text(stringResource(R.string.recently_added_artists), style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(8.dp)) - if (artists != null && artists!!.size > 0) { + if (artists != null && artists!!.isNotEmpty()) { LazyRow { items(artists!!.size) { i -> Box(modifier = Modifier.width(192.dp)) { @@ -111,7 +111,7 @@ fun Home( item { val artists by homeViewModel.recentlyPlayedArtists.observeAsState() Text(stringResource(R.string.recently_played_artists), style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(8.dp)) - if (artists != null && artists!!.size > 0) { + if (artists != null && artists!!.isNotEmpty()) { LazyRow { items(artists!!.size) { i -> Box(modifier = Modifier.width(192.dp)) { @@ -126,7 +126,7 @@ fun Home( item { val albums by homeViewModel.randomAlbums.observeAsState() Text(stringResource(R.string.random_albums), style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(8.dp)) - if (albums != null && albums!!.size > 0) { + if (albums != null && albums!!.isNotEmpty()) { LazyRow { items(albums!!.size) { i -> Box(modifier = Modifier.width(192.dp)) { @@ -141,7 +141,7 @@ fun Home( item { val artists by homeViewModel.randomArtists.observeAsState() Text(stringResource(R.string.random_artists), style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(8.dp)) - if (artists != null && artists!!.size > 0) { + if (artists != null && artists!!.isNotEmpty()) { LazyRow { items(artists!!.size) { i -> Box(modifier = Modifier.width(192.dp)) { diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/home/HomeViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/home/HomeViewModel.kt index 9f7c9dc3..737a0d69 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/home/HomeViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/home/HomeViewModel.kt @@ -16,9 +16,9 @@ class HomeViewModel constructor( application: Application, private val albumRepository: AlbumRepository, - private val artistRepository: ArtistRepository, + artistRepository: ArtistRepository, ) : AndroidViewModel(application) { - private val _currentDay = MutableLiveData(LocalDate.now()) + private val _currentDay = MutableLiveData(LocalDate.now()) val recentlyReleasedAlbums = albumRepository.albumsByReleased val recentlyAddedAlbums = albumRepository.albumsByAdded diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/login/LoginActivity.kt b/app/src/main/java/me/vanpetegem/accentor/ui/login/LoginActivity.kt index 66efb125..28aedf96 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/login/LoginActivity.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/login/LoginActivity.kt @@ -118,7 +118,7 @@ fun Content(loginViewModel: LoginViewModel = viewModel()) { }.fillMaxWidth() .padding(top = 16.dp, start = 16.dp, end = 16.dp), label = { Text(stringResource(R.string.prompt_server)) }, - isError = !(formState?.serverError == null), + isError = formState?.serverError != null, singleLine = true, keyboardOptions = KeyboardOptions( diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/login/LoginViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/login/LoginViewModel.kt index 94b6e87b..d54d7025 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/login/LoginViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/login/LoginViewModel.kt @@ -25,7 +25,7 @@ class LoginViewModel private val _loading = MutableLiveData() val loading: LiveData = _loading - suspend fun login( + fun login( server: String, username: String, password: String, @@ -48,7 +48,7 @@ class LoginViewModel ) { if (!isServerValid(server)) { _loginFormState.value = LoginFormState(serverError = R.string.invalid_server) - } else if (server.equals("") || username.equals("") || password.equals("")) { + } else if (server == "" || username == "" || password == "") { _loginFormState.value = LoginFormState() } else { _loginFormState.value = LoginFormState(isDataValid = true) @@ -59,7 +59,7 @@ class LoginViewModel try { URI(server) server.startsWith("http", ignoreCase = true) - } catch (e: URISyntaxException) { + } catch (_: URISyntaxException) { false } } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/main/MainViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/main/MainViewModel.kt index 568c8848..02afb162 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/main/MainViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/main/MainViewModel.kt @@ -19,7 +19,6 @@ import me.vanpetegem.accentor.data.playlists.PlaylistRepository import me.vanpetegem.accentor.data.plays.PlayRepository import me.vanpetegem.accentor.data.preferences.PreferencesDataSource import me.vanpetegem.accentor.data.tracks.TrackRepository -import me.vanpetegem.accentor.data.users.User import me.vanpetegem.accentor.data.users.UserRepository import me.vanpetegem.accentor.ui.util.Event import me.vanpetegem.accentor.util.Result @@ -41,14 +40,13 @@ class MainViewModel private val playRepository: PlayRepository, private val preferencesDataSource: PreferencesDataSource, ) : AndroidViewModel(application) { - private val refreshing = MutableLiveData(0) + private val refreshing = MutableLiveData(0) val isRefreshing: LiveData = refreshing.map { if (it != null) it > 0 else false } private var errorSinceLastRefresh: Boolean = false private val _latestError = MutableLiveData?>(null) val latestError: LiveData?> = _latestError - val currentUser: LiveData = userRepository.currentUser val loginState: LiveData = authenticationRepository.isLoggedIn fun refresh() { diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/player/Controls.kt b/app/src/main/java/me/vanpetegem/accentor/ui/player/Controls.kt index 1b8342be..c66d0708 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/player/Controls.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/player/Controls.kt @@ -146,7 +146,7 @@ fun Controls(playerViewModel: PlayerViewModel = viewModel()) { val currentTrack by playerViewModel.currentTrack.observeAsState() val trackLength = currentTrack?.length ?: 1 Timer { playerViewModel.updateCurrentPosition() } - Text(if (seekPosition != null) seekPosition.formatTrackLength() else currentPosition.formatTrackLength()) + Text(seekPosition?.formatTrackLength() ?: currentPosition.formatTrackLength()) Box(modifier = Modifier.weight(1f).padding(horizontal = 8.dp)) { Slider( seekPosition?.toFloat() ?: (currentPosition?.toFloat() ?: 0f), diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/player/PlayerOverlay.kt b/app/src/main/java/me/vanpetegem/accentor/ui/player/PlayerOverlay.kt index 4b906e55..d5c5e9f8 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/player/PlayerOverlay.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/player/PlayerOverlay.kt @@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.safeDrawingPadding @@ -51,7 +50,7 @@ fun PlayerOverlay( val queueLength by playerViewModel.queueLength.observeAsState() val showPlayer = (queueLength ?: 0) > 0 val isLandscape = (LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE) - val isMultiWindow = LocalActivity.current?.isInMultiWindowMode() ?: false + val isMultiWindow = LocalActivity.current?.isInMultiWindowMode ?: false val closePlayer: () -> Unit = { scope.launch { anchoredDraggableState.animateTo(false) } } Box( diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/player/PlayerViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/player/PlayerViewModel.kt index 386aba55..23e0100f 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/player/PlayerViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/player/PlayerViewModel.kt @@ -18,7 +18,7 @@ class PlayerViewModel application: Application, private val mediaSessionConnection: MediaSessionConnection, ) : AndroidViewModel(application) { - private val _showQueue = MutableLiveData(false) + private val _showQueue = MutableLiveData(false) val showQueue: LiveData = _showQueue val currentTrack = mediaSessionConnection.currentTrack @@ -37,49 +37,47 @@ class PlayerViewModel _showQueue.value = !(_showQueue.value ?: false) } - suspend fun stop() = mediaSessionConnection.stop() + fun play(album: Album) = mediaSessionConnection.play(album) - suspend fun play(album: Album) = mediaSessionConnection.play(album) + fun play(track: Track) = mediaSessionConnection.play(track) - suspend fun play(track: Track) = mediaSessionConnection.play(track) + fun play(playlist: Playlist) = mediaSessionConnection.play(playlist) - suspend fun play(playlist: Playlist) = mediaSessionConnection.play(playlist) + fun addTrackToQueue(track: Track) = mediaSessionConnection.addTrackToQueue(track) - suspend fun addTrackToQueue(track: Track) = mediaSessionConnection.addTrackToQueue(track) + fun addTracksToQueue(album: Album) = mediaSessionConnection.addTracksToQueue(album) - suspend fun addTracksToQueue(album: Album) = mediaSessionConnection.addTracksToQueue(album) + fun addTracksToQueue(playlist: Playlist) = mediaSessionConnection.addTracksToQueue(playlist) - suspend fun addTracksToQueue(playlist: Playlist) = mediaSessionConnection.addTracksToQueue(playlist) - - suspend fun addTrackToQueue( + fun addTrackToQueue( track: Track, index: Int, ) = mediaSessionConnection.addTrackToQueue(track, index) - suspend fun addTracksToQueue( + fun addTracksToQueue( album: Album, index: Int, ) = mediaSessionConnection.addTracksToQueue(album, index) - suspend fun clearQueue() = mediaSessionConnection.clearQueue() + fun clearQueue() = mediaSessionConnection.clearQueue() - suspend fun previous() = mediaSessionConnection.previous() + fun previous() = mediaSessionConnection.previous() - suspend fun pause() = mediaSessionConnection.pause() + fun pause() = mediaSessionConnection.pause() - suspend fun play() = mediaSessionConnection.play() + fun play() = mediaSessionConnection.play() - suspend fun next() = mediaSessionConnection.next() + fun next() = mediaSessionConnection.next() - suspend fun seekTo(time: Int) = mediaSessionConnection.seekTo(time) + fun seekTo(time: Int) = mediaSessionConnection.seekTo(time) - suspend fun skipTo(position: Int) = mediaSessionConnection.skipTo(position) + fun skipTo(position: Int) = mediaSessionConnection.skipTo(position) - suspend fun removeFromQueue(position: Int) = mediaSessionConnection.removeFromQueue(position) + fun removeFromQueue(position: Int) = mediaSessionConnection.removeFromQueue(position) - suspend fun setRepeatMode(repeatMode: Int) = mediaSessionConnection.setRepeatMode(repeatMode) + fun setRepeatMode(repeatMode: Int) = mediaSessionConnection.setRepeatMode(repeatMode) - suspend fun setShuffleMode(shuffleMode: Boolean) = mediaSessionConnection.setShuffleMode(shuffleMode) + fun setShuffleMode(shuffleMode: Boolean) = mediaSessionConnection.setShuffleMode(shuffleMode) - suspend fun updateCurrentPosition() = mediaSessionConnection.updateCurrentPosition() + fun updateCurrentPosition() = mediaSessionConnection.updateCurrentPosition() } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistView.kt b/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistView.kt index 29b52e8b..12e3e7a4 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistView.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistView.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistViewModel.kt index ac8cbe3f..c2c0a8cf 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistViewModel.kt @@ -24,9 +24,9 @@ class PlaylistViewModel constructor( application: Application, private val playlistRepository: PlaylistRepository, - private val userRepository: UserRepository, - private val albumRepository: AlbumRepository, - private val artistRepository: ArtistRepository, + userRepository: UserRepository, + albumRepository: AlbumRepository, + artistRepository: ArtistRepository, private val trackRepository: TrackRepository, ) : AndroidViewModel(application) { val allUsersById: LiveData> = userRepository.allUsersById diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistsViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistsViewModel.kt index 95ea8bae..2d5b0456 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistsViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/playlists/PlaylistsViewModel.kt @@ -20,22 +20,22 @@ class PlaylistsViewModel @Inject constructor( application: Application, - private val playlistRepository: PlaylistRepository, - private val userRepository: UserRepository, + playlistRepository: PlaylistRepository, + userRepository: UserRepository, ) : AndroidViewModel(application) { val allPlaylists: LiveData> = playlistRepository.allPlaylists val allUsersById: LiveData> = userRepository.allUsersById - private val _searching = MutableLiveData(false) + private val _searching = MutableLiveData(false) val searching: LiveData = _searching - private val _query = MutableLiveData("") + private val _query = MutableLiveData("") val query: LiveData = _query val filteredPlaylists: LiveData> = allPlaylists.switchMap { playlists -> query.map { query -> - if (query.equals("")) { + if (query == "") { playlists } else { playlists.filter { p -> p.name.contains(Normalizer.normalize(query, Normalizer.Form.NFKD), ignoreCase = true) } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/preferences/PreferencesViewModel.kt b/app/src/main/java/me/vanpetegem/accentor/ui/preferences/PreferencesViewModel.kt index 583663bb..9dd33f3c 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/preferences/PreferencesViewModel.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/preferences/PreferencesViewModel.kt @@ -21,8 +21,8 @@ class PreferencesViewModel constructor( application: Application, private val preferencesDataSource: PreferencesDataSource, - private val userRepository: UserRepository, - private val authenticationRepository: AuthenticationRepository, + userRepository: UserRepository, + authenticationRepository: AuthenticationRepository, private val codecConversionRepository: CodecConversionRepository, ) : AndroidViewModel(application) { private val conversionId: LiveData = preferencesDataSource.conversionId diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/util/Event.kt b/app/src/main/java/me/vanpetegem/accentor/ui/util/Event.kt index 126a76a3..ac91213a 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/util/Event.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/util/Event.kt @@ -13,6 +13,4 @@ open class Event( handled = true return content } - - fun peek(): T = content } diff --git a/app/src/main/java/me/vanpetegem/accentor/ui/util/Timer.kt b/app/src/main/java/me/vanpetegem/accentor/ui/util/Timer.kt index 3b2ab3e0..dc88710a 100644 --- a/app/src/main/java/me/vanpetegem/accentor/ui/util/Timer.kt +++ b/app/src/main/java/me/vanpetegem/accentor/ui/util/Timer.kt @@ -2,9 +2,7 @@ package me.vanpetegem.accentor.ui.util import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.delay import kotlinx.coroutines.launch diff --git a/app/src/main/java/me/vanpetegem/accentor/util/SharedPreferenceLiveData.kt b/app/src/main/java/me/vanpetegem/accentor/util/SharedPreferenceLiveData.kt index ccfd2790..c0a7d4eb 100644 --- a/app/src/main/java/me/vanpetegem/accentor/util/SharedPreferenceLiveData.kt +++ b/app/src/main/java/me/vanpetegem/accentor/util/SharedPreferenceLiveData.kt @@ -55,30 +55,6 @@ class SharedPreferenceStringLiveData( override fun getValueFromPreferences(key: String): String? = if (sharedPrefs.contains(key)) sharedPrefs.getString(key, default) else default } -class SharedPreferenceBooleanLiveData( - sharedPrefs: SharedPreferences, - key: String, - private val default: Boolean?, -) : SharedPreferenceLiveData(sharedPrefs, key) { - init { - value = this.getValueFromPreferences(key) - } - - override fun getValueFromPreferences(key: String): Boolean? = if (sharedPrefs.contains(key)) sharedPrefs.getBoolean(key, false) else default -} - -class SharedPreferenceFloatLiveData( - sharedPrefs: SharedPreferences, - key: String, - private val default: Float?, -) : SharedPreferenceLiveData(sharedPrefs, key) { - init { - value = this.getValueFromPreferences(key) - } - - override fun getValueFromPreferences(key: String): Float? = if (sharedPrefs.contains(key)) sharedPrefs.getFloat(key, .0f) else default -} - class SharedPreferenceLongLiveData( sharedPrefs: SharedPreferences, key: String, @@ -101,16 +77,6 @@ fun SharedPreferences.stringLiveData( default: String? = null, ): SharedPreferenceLiveData = SharedPreferenceStringLiveData(this, key, default) -fun SharedPreferences.booleanLiveData( - key: String, - default: Boolean? = null, -): SharedPreferenceLiveData = SharedPreferenceBooleanLiveData(this, key, default) - -fun SharedPreferences.floatLiveData( - key: String, - default: Float? = null, -): SharedPreferenceLiveData = SharedPreferenceFloatLiveData(this, key, default) - fun SharedPreferences.longLiveData( key: String, default: Long? = null, diff --git a/app/src/main/res/ic_launcher.svg b/app/src/main/res/ic_launcher.svg index bc235c5b..d55b142e 100644 --- a/app/src/main/res/ic_launcher.svg +++ b/app/src/main/res/ic_launcher.svg @@ -1,38 +1,5 @@ - - - + diff --git a/flake.nix b/flake.nix index ec8b6c99..4145b655 100644 --- a/flake.nix +++ b/flake.nix @@ -31,12 +31,23 @@ default = accentor-android; accentor-android = pkgs.devshell.mkShell { name = "Accentor Android"; - packages = [ pkgs.jdk17 pkgs.kotlin-language-server pkgs.nixpkgs-fmt ]; + packages = [ pkgs.jdk17 pkgs.nixpkgs-fmt ]; env = [ { name = "ANDROID_SDK_ROOT"; eval = "${composed.androidsdk}/libexec/android-sdk/"; } { name = "BUILD_TOOLS_PATH"; eval = "$ANDROID_SDK_ROOT/build-tools/${buildToolsVersion}"; } { name = "APK_DIR"; eval = "$PRJ_ROOT/app/build/outputs/apk/release"; } ]; + devshell = { + motd = ""; + startup = { + # Hack to get the nix-managed SDK in android studio + "link-devshell-dir".text = '' + mkdir -p $PRJ_DATA_DIR + ln -snf $DEVSHELL_DIR $PRJ_DATA_DIR/devshell + ln -snf ${composed.androidsdk}/libexec/android-sdk/ $PRJ_DATA_DIR/sdk + ''; + }; + }; commands = [ { name = "gradle"; diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5e8a6785..91975b92 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,13 +9,11 @@ appcompat = "1.7.1" coil = "2.7.0" compose-bom = "2025.10.00" core-ktx = "1.17.0" -core-testing = "2.2.0" espresso-core = "3.7.0" fuel = "2.3.1" gson = "2.13.2" hilt = "2.57.2" hilt-navigation-compose = "1.3.0" -junit = "4.13.2" kotlin = "2.2.20" kotlinx = "1.10.2" ksp = "2.2.20-2.0.4" @@ -30,7 +28,6 @@ room = "2.8.2" acra-dialog = { group = "ch.acra", name = "acra-dialog", version.ref = "acra" } acra-mail = { group = "ch.acra", name = "acra-mail", version.ref = "acra" } activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activity" } -activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "activity" } androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "androidx-navigation-compose" } androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" } androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidx-test-runner" } @@ -47,7 +44,6 @@ compose-ui = { group = "androidx.compose.ui", name = "ui" } compose-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } -core-testing = { group = "androidx.arch.core", name = "core-testing", version.ref = "core-testing" } espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" } fuel = { group = "com.github.kittinunf.fuel", name = "fuel", version.ref = "fuel" } fuel-android = { group = "com.github.kittinunf.fuel", name = "fuel-android", version.ref = "fuel" } @@ -55,7 +51,6 @@ gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } hilt = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hilt-navigation-compose" } -junit = { group = "junit", name = "junit", version.ref = "junit" } kotlin-stdlib-jdk8 = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" } kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinx" } kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinx" }