diff --git a/README.md b/README.md index 8c6ae6d51..57f658659 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,6 @@ I primarily built Auxio for myself, but you can use it too, I guess. ## To come in the future: -- Automatic music rescanning - Even better metadata support - Playlists - Liked songs diff --git a/app/src/main/java/org/oxycblt/auxio/image/BaseFetcher.kt b/app/src/main/java/org/oxycblt/auxio/image/BaseFetcher.kt index 30490afdc..e938f99df 100644 --- a/app/src/main/java/org/oxycblt/auxio/image/BaseFetcher.kt +++ b/app/src/main/java/org/oxycblt/auxio/image/BaseFetcher.kt @@ -116,7 +116,7 @@ abstract class BaseFetcher : Fetcher { private fun fetchAospMetadataCovers(context: Context, album: Album): InputStream? { MediaMetadataRetriever().apply { // This call is time-consuming but it also doesn't seem to hold up the main thread, - // so it's probably fine not to wrap it. + // so it's probably fine not to wrap it.rmt setDataSource(context, album.songs[0].uri) // Get the embedded picture from MediaMetadataRetriever, which will return a full diff --git a/app/src/main/java/org/oxycblt/auxio/music/system/IndexerNotifications.kt b/app/src/main/java/org/oxycblt/auxio/music/system/IndexerNotifications.kt index ee9525394..3a9a28184 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/system/IndexerNotifications.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/system/IndexerNotifications.kt @@ -51,7 +51,7 @@ class IndexingNotification(private val context: Context) : setSilent(true) setContentIntent(context.newMainPendingIntent()) setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - setContentTitle(context.getString(R.string.info_indexer_channel_name)) + setContentTitle(context.getString(R.string.lbl_indexing)) setContentText(context.getString(R.string.lbl_indexing_desc)) setProgress(0, 0, true) } diff --git a/app/src/main/java/org/oxycblt/auxio/music/system/IndexerService.kt b/app/src/main/java/org/oxycblt/auxio/music/system/IndexerService.kt index 0461c2e5c..6dac988aa 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/system/IndexerService.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/system/IndexerService.kt @@ -217,7 +217,7 @@ class IndexerService : Service(), Indexer.Controller, Settings.Callback { } } - /** Internal content observer intended to work with the automatic reloading framework. */ + /** Internal content observer intended to work with the automatic reloading system. */ private inner class SystemContentObserver( private val handler: Handler = Handler(Looper.getMainLooper()) ) : ContentObserver(handler), Runnable { 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 a769ea585..182450f5e 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 @@ -468,16 +468,18 @@ class Api21MediaStoreBackend : MediaStoreBackend() { * @author OxygenCobalt */ @RequiresApi(Build.VERSION_CODES.Q) -open class VolumeAwareMediaStoreBackend : MediaStoreBackend() { +open class BaseApi29MediaStoreBackend : MediaStoreBackend() { private var volumeIndex = -1 private var relativePathIndex = -1 + private var dateTakenIndex = -1 override val projection: Array get() = super.projection + arrayOf( MediaStore.Audio.AudioColumns.VOLUME_NAME, - MediaStore.Audio.AudioColumns.RELATIVE_PATH) + MediaStore.Audio.AudioColumns.RELATIVE_PATH, + MediaStore.Audio.AudioColumns.DATE_TAKEN) override val dirSelector: String get() = @@ -498,6 +500,7 @@ open class VolumeAwareMediaStoreBackend : MediaStoreBackend() { volumeIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.VOLUME_NAME) relativePathIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.RELATIVE_PATH) + dateTakenIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.DATE_TAKEN) } val volumeName = cursor.getString(volumeIndex) @@ -510,6 +513,9 @@ open class VolumeAwareMediaStoreBackend : MediaStoreBackend() { audio.dir = Directory(volume, relativePath.removeSuffix(File.separator)) } + // If the YEAR value is empty, see if DATE_TAKEN can fill in. + logD("${audio.title} ${cursor.getString(dateTakenIndex)}") + return audio } } @@ -520,11 +526,14 @@ open class VolumeAwareMediaStoreBackend : MediaStoreBackend() { * @author OxygenCobalt */ @RequiresApi(Build.VERSION_CODES.Q) -open class Api29MediaStoreBackend : VolumeAwareMediaStoreBackend() { +open class Api29MediaStoreBackend : BaseApi29MediaStoreBackend() { private var trackIndex = -1 override val projection: Array - get() = super.projection + arrayOf(MediaStore.Audio.AudioColumns.TRACK) + get() = + super.projection + + arrayOf( + MediaStore.Audio.AudioColumns.TRACK, MediaStore.Audio.AudioColumns.DATE_TAKEN) override fun buildAudio(context: Context, cursor: Cursor): Audio { val audio = super.buildAudio(context, cursor) @@ -551,7 +560,7 @@ open class Api29MediaStoreBackend : VolumeAwareMediaStoreBackend() { * @author OxygenCobalt */ @RequiresApi(Build.VERSION_CODES.R) -class Api30MediaStoreBackend : VolumeAwareMediaStoreBackend() { +class Api30MediaStoreBackend : BaseApi29MediaStoreBackend() { private var trackIndex: Int = -1 private var discIndex: Int = -1 diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index 7cdb1420e..cafeaf965 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -70,7 +70,7 @@ class PlaybackStateManager private constructor() { notifyPlayingChanged() } /** The current playback progress */ - var positionMs = 0L + private var positionMs = 0L /** The current [RepeatMode] */ var repeatMode = RepeatMode.NONE set(value) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index db6d8919a..0511f9aa5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,6 +6,7 @@ android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="?attr/colorSurface" app:defaultNavHost="true" app:navGraph="@navigation/nav_main" tools:layout="@layout/fragment_main" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31dc2bc91..7f4a6a5e2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,9 +9,10 @@ Retry Grant + Loading music Loading your music library… - Automatic reloading - Monitoring your music library for changes… (You can disable this in settings) + Monitoring music library + Monitoring your music library for changes… Genres Artists @@ -150,7 +151,7 @@ Ignore MediaStore tags Increases tag quality, but requires longer loading times (Experimental) Automatic reloading - Reload music whenever your audio files change (Experimental) + Reload your music library whenever it changes (Experimental) No music found diff --git a/app/src/main/res/values/styles_core.xml b/app/src/main/res/values/styles_core.xml index c066f850f..12f348d23 100644 --- a/app/src/main/res/values/styles_core.xml +++ b/app/src/main/res/values/styles_core.xml @@ -20,8 +20,6 @@ ?attr/colorSurface ?attr/colorSurface none - @style/Widget.Auxio.Toolbar.Navigation - @style/Widget.Auxio.Button.Overflow false true @@ -35,6 +33,8 @@ @style/Widget.Auxio.Slider @style/Widget.Auxio.LinearProgressIndicator @style/Widget.Material3.TextInputLayout.OutlinedBox + @style/Widget.Auxio.Toolbar.Navigation + @style/Widget.Auxio.Button.Overflow @style/TextAppearance.Auxio.DisplayLarge @style/TextAppearance.Auxio.DisplayMedium