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 50f84d186..71cfa040f 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -48,7 +48,6 @@ import org.oxycblt.auxio.util.collect import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.unlikelyToBeNull @@ -134,10 +133,11 @@ class AlbumDetailFragment : } override fun onOpenMenu(item: Item, anchor: View) { - when (item) { - is Song -> musicMenu(anchor, R.menu.menu_album_song_actions, item) - else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") + if (item is Song) { + musicMenu(anchor, R.menu.menu_album_song_actions, item) } + + error("Unexpected datatype when opening menu: ${item::class.java}") } override fun onPlayParent() { @@ -220,7 +220,7 @@ class AlbumDetailFragment : .navigate(AlbumDetailFragmentDirections.actionShowArtist(item.id)) } null -> {} - else -> logEOrThrow("Unexpected navigation item ${item::class.java}") + else -> error("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 6ac312a5a..8d0e9313a 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -45,7 +45,6 @@ import org.oxycblt.auxio.util.collect import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.unlikelyToBeNull @@ -130,7 +129,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 -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") + else -> error("Unexpected datatype when opening menu: ${item::class.java}") } } @@ -197,7 +196,7 @@ class ArtistDetailFragment : } } null -> {} - else -> logEOrThrow("Unexpected navigation item ${item::class.java}") + else -> error("Unexpected navigation item ${item::class.java}") } } 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 9d529c018..a0faab276 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -46,7 +46,6 @@ import org.oxycblt.auxio.util.collect import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.unlikelyToBeNull @@ -132,7 +131,7 @@ class GenreDetailFragment : override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Song -> musicMenu(anchor, R.menu.menu_song_actions, item) - else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") + else -> error("Unexpected datatype when opening menu: ${item::class.java}") } } 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 518be4c84..edac650da 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 @@ -35,7 +35,6 @@ import org.oxycblt.auxio.ui.recycler.MenuItemListener import org.oxycblt.auxio.ui.recycler.SyncListDiffer import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.formatDurationMs -import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.secsToMs /** @@ -104,7 +103,7 @@ class AlbumListFragment : HomeListFragment() { override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Album -> musicMenu(anchor, R.menu.menu_album_actions, item) - else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") + else -> error("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 792f006b4..1600f7358 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 @@ -33,7 +33,6 @@ import org.oxycblt.auxio.ui.recycler.MenuItemListener import org.oxycblt.auxio.ui.recycler.SyncListDiffer import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.formatDurationMs -import org.oxycblt.auxio.util.logEOrThrow /** * A [HomeListFragment] for showing a list of [Artist]s. @@ -80,7 +79,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 -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") + else -> error("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 52787c4e4..385fca8e4 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 @@ -33,7 +33,6 @@ import org.oxycblt.auxio.ui.recycler.MenuItemListener import org.oxycblt.auxio.ui.recycler.SyncListDiffer import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.formatDurationMs -import org.oxycblt.auxio.util.logEOrThrow /** * A [HomeListFragment] for showing a list of [Genre]s. @@ -80,7 +79,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 -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") + else -> error("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 dd013e360..95d634e13 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 @@ -36,7 +36,6 @@ import org.oxycblt.auxio.ui.recycler.SyncListDiffer import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.formatDurationMs -import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.secsToMs /** @@ -108,7 +107,7 @@ class SongListFragment : HomeListFragment() { override fun onOpenMenu(item: Item, anchor: View) { when (item) { is Song -> musicMenu(anchor, R.menu.menu_song_actions, item) - else -> logEOrThrow("Unexpected datatype when opening menu: ${item::class.java}") + else -> error("Unexpected datatype when opening menu: ${item::class.java}") } } 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 b24b347eb..b29e4beea 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/StorageFramework.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/StorageFramework.kt @@ -30,7 +30,6 @@ import java.io.File import java.lang.reflect.Method import org.oxycblt.auxio.R import org.oxycblt.auxio.util.lazyReflectedMethod -import org.oxycblt.auxio.util.logEOrThrow /** A path to a file. [name] is the stripped file name, [parent] is the parent path. */ data class Path(val name: String, val parent: Directory) @@ -39,14 +38,7 @@ data class Path(val name: String, val parent: Directory) * A path to a directory. [volume] is the volume the directory resides in, and [relativePath] is the * path from the volume's root to the directory itself. */ -data class Directory(val volume: StorageVolume, val relativePath: String) { - init { - if (relativePath.startsWith(File.separatorChar) || - relativePath.endsWith(File.separatorChar)) { - logEOrThrow("Path was formatted with trailing separators") - } - } - +class Directory private constructor(val volume: StorageVolume, val relativePath: String) { fun resolveName(context: Context) = context.getString(R.string.fmt_path, volume.getDescriptionCompat(context), relativePath) @@ -60,9 +52,22 @@ data class Directory(val volume: StorageVolume, val relativePath: String) { volume.uuidCompat?.let { uuid -> "${uuid}:${relativePath}" } } + override fun hashCode(): Int { + var result = volume.hashCode() + result = 31 * result + relativePath.hashCode() + return result + } + + override fun equals(other: Any?) = + other is Directory && other.volume == volume && other.relativePath == relativePath + companion object { private const val DOCUMENT_URI_PRIMARY_NAME = "primary" + fun from(volume: StorageVolume, relativePath: String) = + Directory( + volume, relativePath.removePrefix(File.separator).removeSuffix(File.separator)) + /** * Converts an opaque document uri in the form of VOLUME:PATH into a [Directory]. This is a * flagrant violation of the API convention, but since we never really write to the URI I @@ -79,7 +84,7 @@ data class Directory(val volume: StorageVolume, val relativePath: String) { val relativePath = split.getOrNull(1) - return Directory(volume ?: return null, relativePath ?: return null) + return from(volume ?: return null, relativePath ?: return null) } } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/system/MediaStoreBackend.kt b/app/src/main/java/org/oxycblt/auxio/music/system/MediaStoreBackend.kt index ea1820285..6b3fdd56b 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/system/MediaStoreBackend.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/system/MediaStoreBackend.kt @@ -441,7 +441,7 @@ class Api21MediaStoreBackend : MediaStoreBackend() { val volumePath = volume.directoryCompat ?: continue val strippedPath = rawPath.removePrefix(volumePath) if (strippedPath != rawPath) { - audio.dir = Directory(volume, strippedPath.removePrefix(File.separator)) + audio.dir = Directory.from(volume, strippedPath) break } } @@ -501,7 +501,7 @@ open class BaseApi29MediaStoreBackend : MediaStoreBackend() { // This is what we use for the Directory's volume. val volume = volumes.find { it.mediaStoreVolumeNameCompat == volumeName } if (volume != null) { - audio.dir = Directory(volume, relativePath.removeSuffix(File.separator)) + audio.dir = Directory.from(volume, relativePath) } return audio diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt index 242ac6b8d..4fa3cf5fe 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt @@ -42,7 +42,6 @@ import org.oxycblt.auxio.ui.accent.AccentCustomizeDialog import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.isNight import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.systemBarInsetsCompat @@ -108,7 +107,7 @@ class SettingsListFragment : PreferenceFragmentCompat() { .show(childFragmentManager, PreAmpCustomizeDialog.TAG) context.getString(R.string.set_key_music_dirs) -> MusicDirsDialog().show(childFragmentManager, MusicDirsDialog.TAG) - else -> logEOrThrow("Unexpected dialog key ${preference.key}") + else -> error("Unexpected dialog key ${preference.key}") } } else -> super.onDisplayPreferenceDialog(preference) 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 e0835b29c..6213579e9 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 @@ -19,7 +19,7 @@ package org.oxycblt.auxio.ui.accent import android.os.Build import org.oxycblt.auxio.R -import org.oxycblt.auxio.util.logEOrThrow +import org.oxycblt.auxio.util.logW private val ACCENT_NAMES = intArrayOf( @@ -131,7 +131,7 @@ class Accent private constructor(val index: Int) { companion object { fun from(index: Int): Accent { if (index > (MAX - 1)) { - logEOrThrow("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/ui/fragment/MenuFragment.kt b/app/src/main/java/org/oxycblt/auxio/ui/fragment/MenuFragment.kt index 6406349f6..26e031e7e 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/fragment/MenuFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/fragment/MenuFragment.kt @@ -33,7 +33,6 @@ import org.oxycblt.auxio.ui.MainNavigationAction import org.oxycblt.auxio.ui.NavigationViewModel import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.logD -import org.oxycblt.auxio.util.logEOrThrow import org.oxycblt.auxio.util.showToast /** @@ -74,7 +73,7 @@ abstract class MenuFragment : ViewBindingFragment() { navModel.mainNavigateTo(MainNavigationAction.SongDetails(song)) } else -> { - logEOrThrow("Unexpected menu item selected") + error("Unexpected menu item selected") return@musicMenuImpl false } } @@ -110,8 +109,7 @@ abstract class MenuFragment : ViewBindingFragment() { navModel.exploreNavigateTo(album.artist) } else -> { - logEOrThrow("Unexpected menu item selected") - return@musicMenuImpl false + error("Unexpected menu item selected") } } @@ -143,7 +141,7 @@ abstract class MenuFragment : ViewBindingFragment() { requireContext().showToast(R.string.lng_queue_added) } else -> { - logEOrThrow("Unexpected menu item selected") + error("Unexpected menu item selected") return@musicMenuImpl false } } @@ -176,8 +174,7 @@ abstract class MenuFragment : ViewBindingFragment() { requireContext().showToast(R.string.lng_queue_added) } else -> { - logEOrThrow("Unexpected menu item selected") - return@musicMenuImpl false + error("Unexpected menu item selected") } } 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 39719580e..eb48b2bb1 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/LogUtil.kt @@ -45,18 +45,6 @@ fun Any.logW(msg: String) = Log.w(autoTag, msg) /** Shortcut method for logging [msg] as an error to the console. Handles anonymous objects */ fun Any.logE(msg: String) = Log.e(autoTag, msg) -/** - * Logs an error on release, but throws an exception in debug. This is useful for non-showstopper - * bugs that I would still prefer to be caught in debug mode. - */ -fun Any.logEOrThrow(msg: String) { - if (BuildConfig.DEBUG) { - error(msg) - } else { - logE(msg) - } -} - /** Automatically creates a tag that identifies the object currently logging. */ private val Any.autoTag: String get() = "Auxio.${this::class.simpleName ?: "Anonymous Object"}"