From 3d8d2e0975a2ece4cd8790fdb73b50fa9a64bab8 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Wed, 15 Jun 2022 11:06:10 -0600 Subject: [PATCH] all: update logging Improve logging use across the app. --- .../auxio/detail/AlbumDetailFragment.kt | 6 +- .../auxio/detail/ArtistDetailFragment.kt | 6 +- .../oxycblt/auxio/detail/DetailViewModel.kt | 89 ++++++++++--------- .../auxio/detail/GenreDetailFragment.kt | 4 +- .../org/oxycblt/auxio/home/HomeFragment.kt | 3 +- .../org/oxycblt/auxio/home/HomeViewModel.kt | 1 + .../auxio/home/list/AlbumListFragment.kt | 4 +- .../auxio/home/list/ArtistListFragment.kt | 4 +- .../auxio/home/list/GenreListFragment.kt | 4 +- .../auxio/home/list/SongListFragment.kt | 4 +- .../org/oxycblt/auxio/image/ImageGroup.kt | 1 + .../java/org/oxycblt/auxio/music/Indexer.kt | 2 + .../org/oxycblt/auxio/music/IndexerService.kt | 3 + .../java/org/oxycblt/auxio/music/MusicUtil.kt | 1 + .../oxycblt/auxio/music/StorageFramework.kt | 2 + .../auxio/music/dirs/MusicDirsDialog.kt | 2 - .../oxycblt/auxio/playback/StyledSeekBar.kt | 4 + .../replaygain/ReplayGainAudioProcessor.kt | 3 +- .../oxycblt/auxio/settings/SettingsCompat.kt | 9 +- .../auxio/settings/SettingsFragment.kt | 2 +- .../org/oxycblt/auxio/ui/BottomSheetLayout.kt | 5 ++ .../oxycblt/auxio/ui/DialogRecyclerView.kt | 17 ++-- .../org/oxycblt/auxio/ui/EdgeAppBarLayout.kt | 3 +- .../java/org/oxycblt/auxio/ui/MenuFragment.kt | 20 +++-- .../oxycblt/auxio/ui/NavigationViewModel.kt | 17 +++- .../main/java/org/oxycblt/auxio/ui/Sort.kt | 10 +-- .../org/oxycblt/auxio/ui/accent/Accent.kt | 2 +- .../org/oxycblt/auxio/util/FrameworkUtil.kt | 1 - .../java/org/oxycblt/auxio/util/LogUtil.kt | 2 +- .../oxycblt/auxio/widgets/WidgetComponent.kt | 5 ++ app/src/main/res/layout/fragment_detail.xml | 1 - 31 files changed, 142 insertions(+), 95 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt index 15e8abc59..05173208b 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -46,7 +46,7 @@ import org.oxycblt.auxio.util.canScroll import org.oxycblt.auxio.util.collectWith import org.oxycblt.auxio.util.launch import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.unlikelyToBeNull @@ -125,7 +125,7 @@ class AlbumDetailFragment : override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Song -> musicMenu(anchor, R.menu.menu_album_song_actions, item) - else -> logW("Unexpected datatype when opening menu: ${item::class.java}") + else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") } } @@ -204,7 +204,7 @@ class AlbumDetailFragment : .navigate(AlbumDetailFragmentDirections.actionShowArtist(item.id)) } null -> {} - else -> logW("Unsupported navigation item ${item::class.java}") + else -> logEOrThrow("Unexpected navigation item ${item::class.java}") } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt index 71e879492..28d66480f 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -43,7 +43,7 @@ import org.oxycblt.auxio.util.applySpans import org.oxycblt.auxio.util.collectWith import org.oxycblt.auxio.util.launch import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.unlikelyToBeNull @@ -119,7 +119,7 @@ class ArtistDetailFragment : when (item) { is Song -> musicMenu(anchor, R.menu.menu_artist_song_actions, item) is Album -> musicMenu(anchor, R.menu.menu_artist_album_actions, item) - else -> logW("Unexpected datatype when opening menu: ${item::class.java}") + else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") } } @@ -179,7 +179,7 @@ class ArtistDetailFragment : } } null -> {} - else -> logW("Unsupported navigation item ${item::class.java}") + else -> logEOrThrow("Unexpected navigation item ${item::class.java}") } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt index 1d5063bfa..e25d0d739 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -156,55 +156,55 @@ class DetailViewModel(application: Application) : private fun generateDetailSong(song: Song) { viewModelScope.launch { - _currentSong.value = - withContext(Dispatchers.IO) { - val extractor = MediaExtractor() + _currentSong.value = withContext(Dispatchers.IO) { generateDetailSongImpl(song) } + } + } + private fun generateDetailSongImpl(song: Song): DetailSong { + val extractor = MediaExtractor() + + try { + extractor.setDataSource(application, song.uri, emptyMap()) + } catch (e: Exception) { + logW("Unable to extract song attributes.") + logW(e.stackTraceToString()) + return DetailSong(song, null, null, song.mimeType) + } + + val format = extractor.getTrackFormat(0) + + val bitrate = + try { + format.getInteger(MediaFormat.KEY_BIT_RATE) / 1000 // bps -> kbps + } catch (e: Exception) { + null + } + + val sampleRate = + try { + format.getInteger(MediaFormat.KEY_SAMPLE_RATE) + } catch (e: Exception) { + null + } + + val resolvedMimeType = + if (song.mimeType.fromFormat != null) { + // ExoPlayer was already able to populate the format. + song.mimeType + } else { + val formatMimeType = try { - @Suppress("BlockingMethodInNonBlockingContext") - extractor.setDataSource(application, song.uri, emptyMap()) + format.getString(MediaFormat.KEY_MIME) } catch (e: Exception) { - logW("Unable to extract song attributes.") - logW(e.stackTraceToString()) - return@withContext DetailSong(song, null, null, song.mimeType) + null } - val format = extractor.getTrackFormat(0) + // Ensure that we don't include the functionally useless + // "audio/raw" mime type + MimeType(song.mimeType.fromExtension, formatMimeType) + } - val bitrate = - try { - format.getInteger(MediaFormat.KEY_BIT_RATE) / 1000 // bps -> kbps - } catch (e: Exception) { - null - } - - val sampleRate = - try { - format.getInteger(MediaFormat.KEY_SAMPLE_RATE) - } catch (e: Exception) { - null - } - - val resolvedMimeType = - if (song.mimeType.fromFormat != null) { - // ExoPlayer was already able to populate the format. - song.mimeType - } else { - val formatMimeType = - try { - format.getString(MediaFormat.KEY_MIME) - } catch (e: Exception) { - null - } - - // Ensure that we don't include the functionally useless - // "audio/raw" mime type - MimeType(song.mimeType.fromExtension, formatMimeType) - } - - DetailSong(song, bitrate, sampleRate, resolvedMimeType) - } - } + return DetailSong(song, bitrate, sampleRate, resolvedMimeType) } private fun refreshAlbumData(album: Album) { @@ -255,6 +255,7 @@ class DetailViewModel(application: Application) : if (library != null) { val song = currentSong.value if (song != null) { + logD("Song changed, refreshing data") val newSong = library.sanitize(song.song) if (newSong != null) { generateDetailSong(newSong) @@ -263,6 +264,7 @@ class DetailViewModel(application: Application) : val album = currentAlbum.value if (album != null) { + logD("Album changed, refreshing data") val newAlbum = library.sanitize(album).also { _currentAlbum.value = it } if (newAlbum != null) { refreshAlbumData(newAlbum) @@ -271,6 +273,7 @@ class DetailViewModel(application: Application) : val artist = currentArtist.value if (artist != null) { + logD("Artist changed, refreshing data") val newArtist = library.sanitize(artist).also { _currentArtist.value = it } if (newArtist != null) { refreshArtistData(newArtist) diff --git a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt index 48aec8aeb..5b1edbf42 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -44,7 +44,7 @@ import org.oxycblt.auxio.util.applySpans import org.oxycblt.auxio.util.collectWith import org.oxycblt.auxio.util.launch import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.unlikelyToBeNull @@ -120,7 +120,7 @@ class GenreDetailFragment : override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Song -> musicMenu(anchor, R.menu.menu_song_actions, item) - else -> logW("Unexpected datatype when opening menu: ${item::class.java}") + else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") } } diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt index d0912a568..11ec8e0b8 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeFragment.kt @@ -60,7 +60,6 @@ import org.oxycblt.auxio.util.launch import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logE import org.oxycblt.auxio.util.logTraceOrThrow -import org.oxycblt.auxio.util.logW import org.oxycblt.auxio.util.textSafe import org.oxycblt.auxio.util.unlikelyToBeNull @@ -282,7 +281,7 @@ class HomeFragment : ViewBindingFragment(), Toolbar.OnMenuI is Indexer.State.Complete -> handleIndexerResponse(binding, state.response) is Indexer.State.Indexing -> handleIndexingState(binding, state.indexing) null -> { - logW("Indexer is in indeterminate state, doing nothing") + logD("Indexer is in indeterminate state, doing nothing") } } } diff --git a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt index a936af0ff..a04cd1862 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/HomeViewModel.kt @@ -128,6 +128,7 @@ class HomeViewModel : ViewModel(), SettingsManager.Callback, MusicStore.Callback * begins to fast scroll. */ fun updateFastScrolling(scrolling: Boolean) { + logD("Updating fast scrolling state: $scrolling") _isFastScrolling.value = scrolling } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt index a699b9584..f0a38e559 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/AlbumListFragment.kt @@ -32,7 +32,7 @@ import org.oxycblt.auxio.ui.Sort import org.oxycblt.auxio.ui.SyncBackingData import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.launch -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.unlikelyToBeNull /** @@ -86,7 +86,7 @@ class AlbumListFragment : HomeListFragment() { override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Album -> musicMenu(anchor, R.menu.menu_album_actions, item) - else -> logW("Unexpected datatype when opening menu: ${item::class.java}") + else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") } } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt index d926bd191..b4a8a928f 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/ArtistListFragment.kt @@ -32,7 +32,7 @@ import org.oxycblt.auxio.ui.Sort import org.oxycblt.auxio.ui.SyncBackingData import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.launch -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.unlikelyToBeNull /** @@ -80,7 +80,7 @@ class ArtistListFragment : HomeListFragment() { override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Artist -> musicMenu(anchor, R.menu.menu_genre_artist_actions, item) - else -> logW("Unexpected datatype when opening menu: ${item::class.java}") + else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") } } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt index 146f34a57..8078d8b09 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/GenreListFragment.kt @@ -32,7 +32,7 @@ import org.oxycblt.auxio.ui.Sort import org.oxycblt.auxio.ui.SyncBackingData import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.launch -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.unlikelyToBeNull /** @@ -80,7 +80,7 @@ class GenreListFragment : HomeListFragment() { override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Genre -> musicMenu(anchor, R.menu.menu_genre_artist_actions, item) - else -> logW("Unexpected datatype when opening menu: ${item::class.java}") + else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") } } diff --git a/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt b/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt index ac2d3c43c..7da89ebd8 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/list/SongListFragment.kt @@ -31,7 +31,7 @@ import org.oxycblt.auxio.ui.Sort import org.oxycblt.auxio.ui.SyncBackingData import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.launch -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.unlikelyToBeNull /** @@ -87,7 +87,7 @@ class SongListFragment : HomeListFragment() { override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Song -> musicMenu(anchor, R.menu.menu_song_actions, item) - else -> logW("Unexpected datatype when opening menu: ${item::class.java}") + else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") } } diff --git a/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt b/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt index af7e9d8e1..3c36fcac5 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/ImageGroup.kt @@ -31,6 +31,7 @@ import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.util.getColorStateListSafe +import org.oxycblt.auxio.util.logD /** * Effectively a super-charged [StyledImageView]. diff --git a/app/src/main/java/org/oxycblt/auxio/music/Indexer.kt b/app/src/main/java/org/oxycblt/auxio/music/Indexer.kt index bcddeeb3a..7c1c6e935 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/Indexer.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/Indexer.kt @@ -118,6 +118,7 @@ class Indexer { * the indexing process to re-index music. */ fun requestReindex() { + logD("Requesting reindex") for (callback in callbacks) { callback.onRequestReindex() } @@ -130,6 +131,7 @@ class Indexer { * corrupt the current state. */ fun cancelLast() { + logD("Cancelling last job") synchronized(this) { currentGeneration++ emitIndexing(null, currentGeneration) diff --git a/app/src/main/java/org/oxycblt/auxio/music/IndexerService.kt b/app/src/main/java/org/oxycblt/auxio/music/IndexerService.kt index 8dff997c0..f9fb1ec68 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/IndexerService.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/IndexerService.kt @@ -90,6 +90,7 @@ class IndexerService : Service(), Indexer.Callback { is Indexer.State.Complete -> { if (state.response is Indexer.Response.Ok && state.response.library != musicStore.library) { + logD("Applying new library") // Load was completed successfully, so apply the new library if we // have not already. musicStore.library = state.response.library @@ -174,6 +175,7 @@ private class IndexerNotification(private val context: Context) : fun updateIndexingState(indexing: Indexer.Indexing): Boolean { when (indexing) { is Indexer.Indexing.Indeterminate -> { + logD("Updating state to $indexing") setContentText(context.getString(R.string.lbl_indexing)) setProgress(0, 0, true) return true @@ -181,6 +183,7 @@ private class IndexerNotification(private val context: Context) : is Indexer.Indexing.Songs -> { // Only update the notification every 50 songs to prevent excessive updates. if (indexing.current % 50 == 0) { + logD("Updating state to $indexing") setContentText( context.getString(R.string.fmt_indexing, indexing.current, indexing.total)) setProgress(indexing.total, indexing.current, false) diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt index bb6a907ef..75c91765c 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicUtil.kt @@ -23,6 +23,7 @@ import android.database.Cursor import android.net.Uri import android.provider.MediaStore import androidx.core.text.isDigitsOnly +import org.oxycblt.auxio.util.logD /** Shortcut for making a [ContentResolver] query with less superfluous arguments. */ fun ContentResolver.queryCursor( diff --git a/app/src/main/java/org/oxycblt/auxio/music/StorageFramework.kt b/app/src/main/java/org/oxycblt/auxio/music/StorageFramework.kt index fa6b7f0b6..d570caffe 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/StorageFramework.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/StorageFramework.kt @@ -113,9 +113,11 @@ val StorageVolume.directoryCompat: String? @SuppressLint("NewApi") fun StorageVolume.getDescriptionCompat(context: Context): String = getDescription(context) +/** If this volume is the primary volume. May still be removable storage. */ val StorageVolume.isPrimaryCompat: Boolean @SuppressLint("NewApi") get() = isPrimary +/** If this volume is emulated. */ val StorageVolume.isEmulatedCompat: Boolean @SuppressLint("NewApi") get() = isEmulated diff --git a/app/src/main/java/org/oxycblt/auxio/music/dirs/MusicDirsDialog.kt b/app/src/main/java/org/oxycblt/auxio/music/dirs/MusicDirsDialog.kt index 717d408f3..5b103a47d 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/dirs/MusicDirsDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/dirs/MusicDirsDialog.kt @@ -167,8 +167,6 @@ class MusicDirsDialog : DocumentsContract.buildDocumentUriUsingTree( uri, DocumentsContract.getTreeDocumentId(uri)) - logD(uri) - // Turn it into a semi-usable path val treeUri = DocumentsContract.getTreeDocumentId(docUri) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/StyledSeekBar.kt b/app/src/main/java/org/oxycblt/auxio/playback/StyledSeekBar.kt index 0033f3ed9..e5e08e6a8 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/StyledSeekBar.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/StyledSeekBar.kt @@ -25,6 +25,7 @@ import kotlin.math.max import org.oxycblt.auxio.databinding.ViewSeekBarBinding import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.inflater +import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.textSafe /** @@ -97,6 +98,7 @@ constructor( // Sanity check 2: If the current value exceeds the new duration value, clamp it // down so that we don't crash and instead have an annoying visual flicker. if (positionSecs > to) { + logD("Clamping invalid position [current: $positionSecs new max: $to]") binding.seekBarSlider.value = to.toFloat() } @@ -105,12 +107,14 @@ constructor( } override fun onStartTrackingTouch(slider: Slider) { + logD("Starting seek mode") // User has begun seeking, place the SeekBar into a "Suspended" mode in which no // position updates are sent and is indicated by the position value turning accented. isActivated = true } override fun onStopTrackingTouch(slider: Slider) { + logD("Confirming seek") // End of seek event, send off new value to callback. isActivated = false callback?.seekTo(slider.value.toLong()) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt index de76c1de6..ab690055d 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/replaygain/ReplayGainAudioProcessor.kt @@ -30,7 +30,6 @@ import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.util.clamp import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logW import org.oxycblt.auxio.util.unlikelyToBeNull /** @@ -65,7 +64,7 @@ class ReplayGainAudioProcessor : BaseAudioProcessor() { */ fun applyReplayGain(metadata: Metadata?) { if (settingsManager.replayGainMode == ReplayGainMode.OFF) { - logW("ReplayGain not enabled") + logD("ReplayGain not enabled") volume = 1f return } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsCompat.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsCompat.kt index 8cd60e954..a804bbf3d 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsCompat.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsCompat.kt @@ -23,6 +23,7 @@ import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import android.os.Build import android.os.storage.StorageManager +import android.util.Log import androidx.core.content.edit import org.oxycblt.auxio.music.Directory import org.oxycblt.auxio.music.directoryCompat @@ -37,6 +38,8 @@ import org.oxycblt.auxio.util.queryAll fun handleAccentCompat(prefs: SharedPreferences): Accent { if (prefs.contains(OldKeys.KEY_ACCENT2)) { + Log.d("SettingsCompat", "Migrating ${OldKeys.KEY_ACCENT2}") + var accent = prefs.getInt(OldKeys.KEY_ACCENT2, 5) // Blue grey was merged with Light Blue in 2.0.0 @@ -62,6 +65,8 @@ fun handleAccentCompat(prefs: SharedPreferences): Accent { } if (prefs.contains(OldKeys.KEY_ACCENT3)) { + Log.d("SettingsCompat", "Migrating ${OldKeys.KEY_ACCENT3}") + var accent = prefs.getInt(OldKeys.KEY_ACCENT3, 5) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Accents were previously frozen as soon as the OS was updated to android twelve, @@ -82,7 +87,8 @@ fun handleAccentCompat(prefs: SharedPreferences): Accent { } /** - * Converts paths from the old excluded directory database to a list of modern [Dir] instances. + * Converts paths from the old excluded directory database to a list of modern [Directory] + * instances. * * Historically, Auxio used an excluded directory database shamelessly ripped from Phonograph. This * was a dumb idea, as the choice of a full-blown database for a few paths was overkill, version @@ -93,6 +99,7 @@ fun handleAccentCompat(prefs: SharedPreferences): Accent { * rolled into this conversion. */ fun handleExcludedCompat(context: Context, storageManager: StorageManager): List { + Log.d("SettingsCompat", "Migrating old excluded database") val db = LegacyExcludedDatabase(context) // /storage/emulated/0 (the old path prefix) should correspond to primary *emulated* storage. val primaryVolume = diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt index 8df14fa6b..1911ab786 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsFragment.kt @@ -33,7 +33,7 @@ class SettingsFragment : ViewBindingFragment() { FragmentSettingsBinding.inflate(inflater) override fun onBindingCreated(binding: FragmentSettingsBinding, savedInstanceState: Bundle?) { - binding.settingsToolbar.setNavigationOnClickListener { findNavController().navigateUp() } binding.settingsAppbar.liftOnScrollTargetViewId = androidx.preference.R.id.recycler_view + binding.settingsToolbar.setNavigationOnClickListener { findNavController().navigateUp() } } } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetLayout.kt b/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetLayout.kt index 28ac4bbc0..433f06e28 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/BottomSheetLayout.kt @@ -291,6 +291,8 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : panelRange = measuredHeight - barView.measuredHeight if (!isLaidOut) { + logD("Doing initial panel layout") + // This is our first layout, so make sure we know what offset we should work with // before we measure our content panelOffset = @@ -383,6 +385,7 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : // not apply any window insets at all, which results in scroll desynchronization on // certain views. This is considered tolerable as the other options are to convert // the playback fragments to views, which is not nice. + logD("Readjusting window insets") val bars = insets.getSystemBarInsetsCompat(this) val consumedByPanel = computePanelTopPosition(panelOffset) - measuredHeight val adjustedBottomInset = (consumedByPanel + bars.bottom).coerceAtLeast(0) @@ -495,9 +498,11 @@ constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) : private fun setPanelStateInternal(state: PanelState) { if (panelState == state) { + logD("State is already $state, not applying") return } + logD("new state: $state") panelState = state sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) diff --git a/app/src/main/java/org/oxycblt/auxio/ui/DialogRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/ui/DialogRecyclerView.kt index 451e4230a..931bab75e 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/DialogRecyclerView.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/DialogRecyclerView.kt @@ -51,18 +51,15 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr add(topDivider) add(bottomDivider) } + } - addOnScrollListener( - object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) + override fun onScrolled(dx: Int, dy: Int) { + super.onScrolled(dx, dy) - val manager = recyclerView.layoutManager as LinearLayoutManager - topDivider.isInvisible = manager.findFirstCompletelyVisibleItemPosition() < 1 - bottomDivider.isInvisible = - manager.findLastCompletelyVisibleItemPosition() == (manager.itemCount - 1) - } - }) + val manager = layoutManager as LinearLayoutManager + topDivider.isInvisible = manager.findFirstCompletelyVisibleItemPosition() < 1 + bottomDivider.isInvisible = + manager.findLastCompletelyVisibleItemPosition() == (manager.itemCount - 1) } override fun onMeasure(widthSpec: Int, heightSpec: Int) { diff --git a/app/src/main/java/org/oxycblt/auxio/ui/EdgeAppBarLayout.kt b/app/src/main/java/org/oxycblt/auxio/ui/EdgeAppBarLayout.kt index 3bf10f320..30b2a73bd 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/EdgeAppBarLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/EdgeAppBarLayout.kt @@ -29,7 +29,6 @@ import androidx.core.content.res.ResourcesCompat import androidx.core.view.updatePadding import com.google.android.material.appbar.AppBarLayout import org.oxycblt.auxio.util.getSystemBarInsetsCompat -import org.oxycblt.auxio.util.logW /** * An [AppBarLayout] that fixes a bug with the default implementation where the lifted state will @@ -90,7 +89,7 @@ constructor(context: Context, attrs: AttributeSet? = null, @AttrRes defStyleAttr if (liftOnScrollTargetViewId != ResourcesCompat.ID_NULL) { scrollingChild = (parent as ViewGroup).findViewById(liftOnScrollTargetViewId) } else { - logW("liftOnScrollTargetViewId was not specified, ignoring scroll events") + error("liftOnScrollTargetViewId was not specified") } } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/MenuFragment.kt b/app/src/main/java/org/oxycblt/auxio/ui/MenuFragment.kt index e7bbefd32..208ab28a5 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/MenuFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/MenuFragment.kt @@ -29,7 +29,8 @@ import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.playback.PlaybackViewModel -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logD +import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast abstract class MenuFragment : ViewBindingFragment() { @@ -39,6 +40,8 @@ abstract class MenuFragment : ViewBindingFragment() { protected val navModel: NavigationViewModel by activityViewModels() protected fun musicMenu(anchor: View, @MenuRes menuRes: Int, song: Song) { + logD("Launching new song menu: ${song.rawName}") + musicMenuImpl(anchor, menuRes) { id -> when (id) { R.id.action_play_next -> { @@ -59,7 +62,7 @@ abstract class MenuFragment : ViewBindingFragment() { navModel.mainNavigateTo(MainNavigationAction.SongDetails(song)) } else -> { - logW("Unknown menu item selected") + logEOrThrow("Unexpected menu item selected") return@musicMenuImpl false } } @@ -69,6 +72,8 @@ abstract class MenuFragment : ViewBindingFragment() { } protected fun musicMenu(anchor: View, @MenuRes menuRes: Int, album: Album) { + logD("Launching new album menu: ${album.rawName}") + musicMenuImpl(anchor, menuRes) { id -> when (id) { R.id.action_play -> { @@ -89,7 +94,7 @@ abstract class MenuFragment : ViewBindingFragment() { navModel.exploreNavigateTo(album.artist) } else -> { - logW("Unknown menu item selected") + logEOrThrow("Unexpected menu item selected") return@musicMenuImpl false } } @@ -99,6 +104,8 @@ abstract class MenuFragment : ViewBindingFragment() { } protected fun musicMenu(anchor: View, @MenuRes menuRes: Int, artist: Artist) { + logD("Launching new artist menu: ${artist.rawName}") + musicMenuImpl(anchor, menuRes) { id -> when (id) { R.id.action_play -> { @@ -116,7 +123,7 @@ abstract class MenuFragment : ViewBindingFragment() { requireContext().showToast(R.string.lbl_queue_added) } else -> { - logW("Unknown menu item selected") + logEOrThrow("Unexpected menu item selected") return@musicMenuImpl false } } @@ -126,6 +133,8 @@ abstract class MenuFragment : ViewBindingFragment() { } protected fun musicMenu(anchor: View, @MenuRes menuRes: Int, genre: Genre) { + logD("Launching new genre menu: ${genre.rawName}") + musicMenuImpl(anchor, menuRes) { id -> when (id) { R.id.action_play -> { @@ -143,7 +152,7 @@ abstract class MenuFragment : ViewBindingFragment() { requireContext().showToast(R.string.lbl_queue_added) } else -> { - logW("Unknown menu item selected") + logEOrThrow("Unexpected menu item selected") return@musicMenuImpl false } } @@ -166,6 +175,7 @@ abstract class MenuFragment : ViewBindingFragment() { protected fun menu(anchor: View, @MenuRes menuRes: Int, block: PopupMenu.() -> Unit) { if (currentMenu != null) { + logD("Menu already present, not launching") return } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/NavigationViewModel.kt b/app/src/main/java/org/oxycblt/auxio/ui/NavigationViewModel.kt index 018a75297..bb367fe38 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/NavigationViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/NavigationViewModel.kt @@ -22,6 +22,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Song +import org.oxycblt.auxio.util.logD /** * A ViewModel that handles complicated navigation situations. @@ -43,23 +44,35 @@ class NavigationViewModel : ViewModel() { /** Notify MainFragment to navigate to the location outlined in [MainNavigationAction]. */ fun mainNavigateTo(action: MainNavigationAction) { - if (_mainNavigationAction.value != null) return + if (_mainNavigationAction.value != null) { + logD("Already navigating, not doing main action") + return + } + + logD("Navigating with action $action") _mainNavigationAction.value = action } /** Mark that the main navigation process is done. */ fun finishMainNavigation() { + logD("Finishing main navigation process") _mainNavigationAction.value = null } /** Navigate to an item's detail menu, whether a song/album/artist */ fun exploreNavigateTo(item: Music) { - if (_exploreNavigationItem.value != null) return + if (_exploreNavigationItem.value != null) { + logD("Already navigation, not doing explore action") + return + } + + logD("Navigating to ${item.rawName}") _exploreNavigationItem.value = item } /** Mark that the item navigation process is done. */ fun finishExploreNavigation() { + logD("Finishing explore navigation process") _exploreNavigationItem.value = null } } diff --git a/app/src/main/java/org/oxycblt/auxio/ui/Sort.kt b/app/src/main/java/org/oxycblt/auxio/ui/Sort.kt index 5d26c200e..e6d9314cc 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/Sort.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/Sort.kt @@ -25,7 +25,7 @@ import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Music import org.oxycblt.auxio.music.Song -import org.oxycblt.auxio.util.logW +import org.oxycblt.auxio.util.logEOrThrow /** * A data class representing the sort modes used in Auxio. @@ -74,19 +74,19 @@ sealed class Sort(open val isAscending: Boolean) { } open fun songsInPlace(songs: MutableList) { - logW("This sort is not supported for songs") + logEOrThrow("This sort is not supported for songs") } open fun albumsInPlace(albums: MutableList) { - logW("This sort is not supported for albums") + logEOrThrow("This sort is not supported for albums") } open fun artistsInPlace(artists: MutableList) { - logW("This sort is not supported for artists") + logEOrThrow("This sort is not supported for artists") } open fun genresInPlace(genres: MutableList) { - logW("This sort is not supported for genres") + logEOrThrow("This sort is not supported for genres") } /** diff --git a/app/src/main/java/org/oxycblt/auxio/ui/accent/Accent.kt b/app/src/main/java/org/oxycblt/auxio/ui/accent/Accent.kt index d70ac06c6..e53a90c25 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/accent/Accent.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/accent/Accent.kt @@ -131,7 +131,7 @@ class Accent private constructor(val index: Int) { companion object { fun from(index: Int): Accent { if (index > (MAX - 1)) { - logW("Account outside of bounds [idx: $index, max: $MAX") + logW("Account outside of bounds [idx: $index, max: $MAX]") return Accent(5) } diff --git a/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt index 5497d5020..ece102877 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/FrameworkUtil.kt @@ -54,7 +54,6 @@ import org.oxycblt.auxio.R */ fun View.disableDropShadowCompat() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - logD("Disabling drop shadows") val transparent = context.getColorSafe(android.R.color.transparent) outlineAmbientShadowColor = transparent outlineSpotShadowColor = transparent diff --git a/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt index 9e56eeac6..3e17c9e02 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt @@ -52,7 +52,7 @@ fun Any.logE(msg: String) = Log.e(autoTag, msg) */ fun Any.logEOrThrow(msg: String) { if (BuildConfig.DEBUG) { - error("${autoTag}: $msg") + error(msg) } else { logE(msg) } diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt index af03679b6..fd9e5e642 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetComponent.kt @@ -31,6 +31,7 @@ import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.playback.state.RepeatMode import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.util.getDimenSizeSafe +import org.oxycblt.auxio.util.logD /** * A wrapper around each [WidgetProvider] that plugs into the main Auxio process and updates the @@ -67,6 +68,7 @@ class WidgetComponent(private val context: Context) : // possible. val song = playbackManager.song if (song == null) { + logD("No song, resetting widget") widget.update(context, null) return } @@ -87,6 +89,8 @@ class WidgetComponent(private val context: Context) : // - After Android 12, the widget has round edges, so we need to round out // the album art. I dislike this, but it's mainly for stylistic cohesion. return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + this@WidgetComponent.logD("Doing API 31 cover load") + val metrics = context.resources.displayMetrics // Use RoundedCornersTransformation. This is because our hack to get a 1:1 @@ -106,6 +110,7 @@ class WidgetComponent(private val context: Context) : // bitmap on very large screens. .size(minOf(metrics.widthPixels, metrics.heightPixels, 1024)) } else { + this@WidgetComponent.logD("Doing API 21 cover load") // Note: Explicitly use the "original" size as without it the scaling logic // in coil breaks down and results in an error. builder.size(Size.ORIGINAL) diff --git a/app/src/main/res/layout/fragment_detail.xml b/app/src/main/res/layout/fragment_detail.xml index c4a29ba54..7a6ee8e6e 100644 --- a/app/src/main/res/layout/fragment_detail.xml +++ b/app/src/main/res/layout/fragment_detail.xml @@ -15,7 +15,6 @@ app:liftOnScroll="true" app:liftOnScrollTargetViewId="@id/detail_recycler"> -