mirror of
https://github.com/austinried/subtracks.git
synced 2026-11-11 07:29:14 +01:00
clear the build warnings and fail on new ones
A clean build now emits no warnings of its own, and Kotlin `allWarningsAsErrors` plus lint `warningsAsErrors` stop new ones from sneaking back in. - Kotlin: give SearchFilter's @StringRes parameter an explicit @param: target; use safe calls for File.parentFile in StringResourcesTest. - Packaging: keep debug symbols for the prebuilt .so files that have no symbol table, which is what the "unable to strip" warning was about. - Lint: move `modifier` to the first optional parameter across the Compose screens, use mutableIntStateOf for int state, read Resources via LocalResources, use the KTX Bitmap.get/String.toUri, drop the unused ic_action_name and ic_stat_name bitmaps and the dead -v24 qualifier on the notification vector, fix the pt-BR "album" accents and the unused Vietnamese/Thai plural quantities, and suppress the intentional cleartext/user-certificate, backup, exported-service and plural-candidate findings. Disable the version-update nags, which the dependency-update process owns. The AboutLibraries plugin still resolves the variant classpaths during configuration, so AGP keeps warning about that one; upstream in mikepenz/AboutLibraries#1369.
This commit is contained in:
@@ -2,8 +2,8 @@ package com.subtracks.data.download
|
||||
|
||||
import android.app.DownloadManager
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.os.Environment
|
||||
import androidx.core.net.toUri
|
||||
import com.subtracks.data.model.DownloadError
|
||||
|
||||
class SystemDownloadEngine(
|
||||
@@ -12,7 +12,7 @@ class SystemDownloadEngine(
|
||||
override fun enqueue(request: EngineRequest): Long {
|
||||
val download =
|
||||
DownloadManager
|
||||
.Request(Uri.parse(request.uri))
|
||||
.Request(request.uri.toUri())
|
||||
.setTitle(request.title)
|
||||
.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_MUSIC, request.path)
|
||||
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN)
|
||||
|
||||
@@ -248,11 +248,11 @@ fun HeroHeader(
|
||||
onDownloadAction: (BulkDownloadAction) -> Unit,
|
||||
onMore: () -> Unit,
|
||||
topInset: Dp,
|
||||
modifier: Modifier = Modifier,
|
||||
controlsModifier: Modifier = Modifier,
|
||||
thumbnailRef: CoverArtRef? = null,
|
||||
comment: String? = null,
|
||||
onSubtitleClick: (() -> Unit)? = null,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
Column(
|
||||
modifier =
|
||||
|
||||
@@ -35,7 +35,7 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalResources
|
||||
import androidx.compose.ui.res.pluralStringResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
@@ -123,6 +123,7 @@ fun HomeListScreen(
|
||||
artists: LazyPagingItems<Artist>,
|
||||
songs: LazyPagingItems<AlbumSongItem>,
|
||||
playlists: LazyPagingItems<Playlist>,
|
||||
modifier: Modifier = Modifier,
|
||||
genres: List<String> = emptyList(),
|
||||
decades: List<Long> = emptyList(),
|
||||
coverArt: (String?, Boolean) -> CoverArtRef? = { _, _ -> null },
|
||||
@@ -135,10 +136,9 @@ fun HomeListScreen(
|
||||
onLongClick: (MenuTarget) -> Unit = {},
|
||||
onGenreClick: (String) -> Unit = {},
|
||||
onDecadeClick: (Long) -> Unit = {},
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val now = remember { System.currentTimeMillis() }
|
||||
val resources = LocalContext.current.resources
|
||||
val resources = LocalResources.current
|
||||
Scaffold(
|
||||
modifier = modifier,
|
||||
topBar = {
|
||||
|
||||
@@ -172,6 +172,7 @@ fun HomeScreen(
|
||||
feed: HomeFeed,
|
||||
coverArt: (String?, Boolean) -> CoverArtRef?,
|
||||
playingSongId: String?,
|
||||
modifier: Modifier = Modifier,
|
||||
topInset: Dp = 0.dp,
|
||||
bottomInset: Dp = 0.dp,
|
||||
onAlbumClick: (Album) -> Unit = {},
|
||||
@@ -182,7 +183,6 @@ fun HomeScreen(
|
||||
onGenreClick: (String) -> Unit = {},
|
||||
onDecadeClick: (Long) -> Unit = {},
|
||||
onSync: () -> Unit = {},
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onBackground) {
|
||||
if (feed.loading) {
|
||||
@@ -295,6 +295,7 @@ fun OfflineHomeScreen(
|
||||
songs: List<AlbumSongItem>,
|
||||
coverArt: (String?, Boolean) -> CoverArtRef?,
|
||||
playingSongId: String?,
|
||||
modifier: Modifier = Modifier,
|
||||
topInset: Dp = 0.dp,
|
||||
bottomInset: Dp = 0.dp,
|
||||
onAlbumClick: (Album) -> Unit = {},
|
||||
@@ -303,7 +304,6 @@ fun OfflineHomeScreen(
|
||||
onSongPlay: (Song) -> Unit = {},
|
||||
onLongClick: (MenuTarget) -> Unit = {},
|
||||
onMore: (OfflineListKind) -> Unit = {},
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onBackground) {
|
||||
LazyColumn(
|
||||
|
||||
@@ -146,6 +146,7 @@ fun AlbumDetailRoute(
|
||||
fun AlbumDetailScreen(
|
||||
album: Album?,
|
||||
songs: List<Song>,
|
||||
modifier: Modifier = Modifier,
|
||||
discs: List<Disc> = emptyList(),
|
||||
coverArt: (String?, Boolean) -> CoverArtRef?,
|
||||
artwork: ArtworkColors?,
|
||||
@@ -160,7 +161,6 @@ fun AlbumDetailScreen(
|
||||
onMore: () -> Unit = {},
|
||||
onArtistClick: (() -> Unit)? = null,
|
||||
playingSongId: String? = null,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val multiDisc = songs.map { it.disc ?: 1L }.distinct().size > 1
|
||||
val resources = LocalResources.current
|
||||
|
||||
@@ -48,6 +48,7 @@ fun AlbumsContent(
|
||||
coverArt: (String?, Boolean) -> CoverArtRef?,
|
||||
bottomInset: Dp,
|
||||
onAlbumClick: (Album) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
onLongClick: (MenuTarget) -> Unit = {},
|
||||
filtered: Boolean = false,
|
||||
onClearFilters: () -> Unit = {},
|
||||
@@ -55,7 +56,6 @@ fun AlbumsContent(
|
||||
topInset: Dp = 0.dp,
|
||||
onSync: () -> Unit = {},
|
||||
downloadStatuses: Map<String, ListDownloadStatus> = emptyMap(),
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
when {
|
||||
items.itemCount == 0 && items.loadState.refresh is LoadState.Loading -> {
|
||||
|
||||
@@ -217,6 +217,7 @@ fun ArtistDetailRoute(
|
||||
@Composable
|
||||
fun ArtistDetailScreen(
|
||||
artist: Artist?,
|
||||
modifier: Modifier = Modifier,
|
||||
artistName: String = "",
|
||||
isAlbumArtist: Boolean = false,
|
||||
albums: List<Album>,
|
||||
@@ -232,7 +233,6 @@ fun ArtistDetailScreen(
|
||||
starred: Boolean = false,
|
||||
onToggleStar: (() -> Unit)? = null,
|
||||
onShuffle: () -> Unit = {},
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val listState = rememberLazyGridState()
|
||||
val fill = rememberViewportFill(listState)
|
||||
|
||||
@@ -45,6 +45,7 @@ fun ArtistsContent(
|
||||
coverArt: (String?, Boolean) -> CoverArtRef?,
|
||||
bottomInset: Dp,
|
||||
onArtistClick: (Artist) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
onLongClick: (MenuTarget) -> Unit = {},
|
||||
filtered: Boolean = false,
|
||||
onClearFilters: () -> Unit = {},
|
||||
@@ -52,7 +53,6 @@ fun ArtistsContent(
|
||||
topInset: Dp = 0.dp,
|
||||
onSync: () -> Unit = {},
|
||||
downloadStatuses: Map<String, ListDownloadStatus> = emptyMap(),
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
when {
|
||||
items.itemCount == 0 && items.loadState.refresh is LoadState.Loading -> {
|
||||
|
||||
@@ -386,6 +386,7 @@ fun LibraryScreen(
|
||||
onPlaylistClick: (Playlist) -> Unit,
|
||||
onSync: () -> Unit,
|
||||
onOpenSettings: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
onOpenSearch: () -> Unit = {},
|
||||
offline: Boolean = false,
|
||||
onExitOffline: () -> Unit = {},
|
||||
@@ -409,7 +410,6 @@ fun LibraryScreen(
|
||||
playlistDownloads: Map<String, ListDownloadStatus> = emptyMap(),
|
||||
dismissals: Flow<Unit> = emptyFlow(),
|
||||
homeContent: @Composable (topInset: Dp, bottomInset: Dp) -> Unit = { _, _ -> },
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val pagerState =
|
||||
rememberPagerState(
|
||||
@@ -831,6 +831,7 @@ private fun ListOptionsGlyph(modifier: Modifier = Modifier) {
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("FrequentlyChangingValue")
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
internal fun LibraryTabs(
|
||||
|
||||
@@ -120,6 +120,7 @@ fun PlaylistDetailScreen(
|
||||
songs: LazyPagingItems<PlaylistSongItem>,
|
||||
coverArt: (String?, Boolean) -> CoverArtRef?,
|
||||
artwork: ArtworkColors?,
|
||||
modifier: Modifier = Modifier,
|
||||
downloads: Map<String, SongDownload> = emptyMap(),
|
||||
downloadStatus: ListDownloadStatus = ListDownloadStatus(),
|
||||
offline: Boolean = false,
|
||||
@@ -131,7 +132,6 @@ fun PlaylistDetailScreen(
|
||||
onPlay: () -> Unit = {},
|
||||
onMore: () -> Unit = {},
|
||||
playingSongId: String? = null,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val context = LocalContext.current
|
||||
HeroDetailScaffold(
|
||||
|
||||
@@ -44,6 +44,7 @@ fun PlaylistsContent(
|
||||
coverArt: (String?, Boolean) -> CoverArtRef?,
|
||||
bottomInset: Dp,
|
||||
onPlaylistClick: (Playlist) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
onLongClick: (MenuTarget) -> Unit = {},
|
||||
filtered: Boolean = false,
|
||||
onClearFilters: () -> Unit = {},
|
||||
@@ -51,7 +52,6 @@ fun PlaylistsContent(
|
||||
topInset: Dp = 0.dp,
|
||||
onSync: () -> Unit = {},
|
||||
downloadStatuses: Map<String, ListDownloadStatus> = emptyMap(),
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
when {
|
||||
items.itemCount == 0 && items.loadState.refresh is LoadState.Loading -> {
|
||||
|
||||
@@ -93,6 +93,7 @@ private fun buildVectorPath(vector: ImageVector): Path {
|
||||
@Composable
|
||||
fun SongRow(
|
||||
song: Song,
|
||||
modifier: Modifier = Modifier,
|
||||
coverArtId: String? = null,
|
||||
coverArt: ((String?, Boolean) -> CoverArtRef?)? = null,
|
||||
isPlaying: Boolean = false,
|
||||
@@ -100,7 +101,6 @@ fun SongRow(
|
||||
durationSeconds: Long? = null,
|
||||
download: SongDownload? = null,
|
||||
trailingContent: (@Composable () -> Unit)? = null,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
ListItem(
|
||||
modifier = modifier,
|
||||
|
||||
@@ -60,10 +60,10 @@ fun MiniPlayer(
|
||||
onExpand: () -> Unit,
|
||||
onPlayPause: () -> Unit,
|
||||
onNext: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
progressInset: Boolean = false,
|
||||
onExpandDrag: (Float) -> Unit = {},
|
||||
onExpandRelease: (Float) -> Unit = {},
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val item = state.item ?: return
|
||||
var dragUpPx by remember { mutableFloatStateOf(0f) }
|
||||
|
||||
@@ -182,9 +182,9 @@ fun NowPlayingRoute(
|
||||
onQueue: () -> Unit,
|
||||
onViewAlbum: (String) -> Unit,
|
||||
onViewArtist: (String) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
contextMenuHost: ContextMenuHost? = null,
|
||||
setStar: (StarType, String, Boolean) -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
controller: PlaybackController = koinInject(),
|
||||
libraryRepository: LibraryRepository = koinInject(),
|
||||
downloadRepository: DownloadRepository = koinInject(),
|
||||
@@ -286,6 +286,7 @@ fun NowPlayingScreen(
|
||||
onPlayPause: () -> Unit,
|
||||
onNext: () -> Unit,
|
||||
onPrevious: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
onSkipPrevious: () -> Unit = onPrevious,
|
||||
onShuffle: () -> Unit = {},
|
||||
onRepeat: () -> Unit = {},
|
||||
@@ -298,7 +299,6 @@ fun NowPlayingScreen(
|
||||
thumbnailRef: CoverArtRef? = null,
|
||||
previousArt: NowPlayingArt? = null,
|
||||
nextArt: NowPlayingArt? = null,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val playButtonSize = 90.dp
|
||||
val playCircleDiameter = playButtonSize * 20f / 24f
|
||||
|
||||
@@ -33,6 +33,7 @@ import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
@@ -106,10 +107,10 @@ class QueueViewModel(
|
||||
var ready by mutableStateOf(false)
|
||||
private set
|
||||
|
||||
var initialIndex by mutableStateOf(0)
|
||||
var initialIndex by mutableIntStateOf(0)
|
||||
private set
|
||||
|
||||
var generation by mutableStateOf(0)
|
||||
var generation by mutableIntStateOf(0)
|
||||
private set
|
||||
|
||||
private var nextId = 0L
|
||||
@@ -562,6 +563,7 @@ internal fun dropTarget(
|
||||
return (before - if (before > from) 1 else 0) + 1
|
||||
}
|
||||
|
||||
@Suppress("ModifierParameter")
|
||||
@Composable
|
||||
private fun QueueRowItem(
|
||||
row: QueueRow,
|
||||
|
||||
@@ -59,7 +59,7 @@ import org.koin.compose.koinInject
|
||||
import org.koin.compose.viewmodel.koinViewModel
|
||||
|
||||
enum class SearchFilter(
|
||||
@StringRes val label: Int,
|
||||
@param:StringRes val label: Int,
|
||||
) {
|
||||
Songs(R.string.search_songs),
|
||||
Albums(R.string.resources_album_name),
|
||||
@@ -125,6 +125,7 @@ fun SearchScreen(
|
||||
query: String,
|
||||
onQueryChange: (String) -> Unit,
|
||||
results: SearchResults,
|
||||
modifier: Modifier = Modifier,
|
||||
filters: Set<SearchFilter> = ALL_FILTERS,
|
||||
onToggleFilter: (SearchFilter) -> Unit = {},
|
||||
coverArt: (String?, Boolean) -> CoverArtRef? = { _, _ -> null },
|
||||
@@ -135,7 +136,6 @@ fun SearchScreen(
|
||||
onPlaylistClick: (Playlist) -> Unit = {},
|
||||
onSongClick: (Song) -> Unit = {},
|
||||
onLongClick: (MenuTarget) -> Unit = {},
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val focusRequester = remember { FocusRequester() }
|
||||
val backLabel = stringResource(R.string.navigation_back)
|
||||
|
||||
@@ -90,8 +90,8 @@ fun AddSourceScreen(
|
||||
onSave: () -> Unit,
|
||||
onDelete: () -> Unit,
|
||||
onBack: (() -> Unit)?,
|
||||
dismissals: Flow<Unit> = emptyFlow(),
|
||||
modifier: Modifier = Modifier,
|
||||
dismissals: Flow<Unit> = emptyFlow(),
|
||||
) {
|
||||
val nameFocus = remember { FocusRequester() }
|
||||
val addressFocus = remember { FocusRequester() }
|
||||
|
||||
@@ -41,6 +41,7 @@ import androidx.compose.material3.TextButton
|
||||
import androidx.compose.material3.TopAppBar
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
@@ -124,6 +125,7 @@ fun SettingsScreen(
|
||||
downloadQuality: StreamQuality,
|
||||
downloadOverMetered: Boolean,
|
||||
scrobbling: Boolean,
|
||||
modifier: Modifier = Modifier,
|
||||
offline: Boolean = false,
|
||||
onSelectSource: (Long) -> Unit,
|
||||
onEditServer: (Long) -> Unit,
|
||||
@@ -139,7 +141,6 @@ fun SettingsScreen(
|
||||
onOpenLicenses: () -> Unit,
|
||||
onBack: () -> Unit,
|
||||
dismissals: Flow<Unit> = emptyFlow(),
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
var dialog by remember { mutableStateOf<SettingsDialog?>(null) }
|
||||
DismissOnRequest(dismissals) { dialog = null }
|
||||
@@ -397,7 +398,7 @@ private fun ConcurrencyDialog(
|
||||
onDismiss: () -> Unit,
|
||||
) {
|
||||
val resources = LocalResources.current
|
||||
var draft by remember(selected) { mutableStateOf(selected) }
|
||||
var draft by remember(selected) { mutableIntStateOf(selected) }
|
||||
AlertDialog(
|
||||
onDismissRequest = onDismiss,
|
||||
title = { Text(stringResource(R.string.sync_concurrency)) },
|
||||
|
||||
@@ -12,6 +12,7 @@ import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.luminance
|
||||
import androidx.core.graphics.get
|
||||
import androidx.palette.graphics.Palette
|
||||
import coil3.SingletonImageLoader
|
||||
import coil3.compose.LocalPlatformContext
|
||||
@@ -202,7 +203,7 @@ object ArtworkSeedCache {
|
||||
x: Int,
|
||||
y: Int,
|
||||
): Float {
|
||||
val color = Color(bitmap.getPixel(x, y))
|
||||
val color = Color(bitmap[x, y])
|
||||
return 0.2126f * color.red + 0.7152f * color.green + 0.0722f * color.blue
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user