From e908d0e102a184940cea2d4b055e62d62d7af106 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 16 Dec 2024 13:09:08 -0500 Subject: [PATCH] all: break off musikr --- .gitmodules | 5 +- app/build.gradle | 43 +++---- .../oxycblt/auxio/detail/DetailViewModel.kt | 20 +--- .../oxycblt/auxio/detail/SongDetailDialog.kt | 105 +++++++++--------- .../musikr/metadata/AudioProperties.kt | 105 ------------------ .../oxycblt/musikr/metadata/MetadataModule.kt | 31 ------ build.gradle | 33 +++++- .../consumer-rules.pro => musikr/.Rhistory | 0 {ktaglib => musikr}/.gitignore | 0 {ktaglib => musikr}/build.gradle | 44 ++++++-- musikr/consumer-rules.pro | 0 {ktaglib => musikr}/proguard-rules.pro | 0 .../src/main/AndroidManifest.xml | 0 .../src/main/cpp/CMakeLists.txt | 0 .../src/main/cpp/JVMInputStream.cpp | 0 .../src/main/cpp/JVMInputStream.h | 2 +- .../src/main/cpp/JVMMetadataBuilder.cpp | 0 .../src/main/cpp/JVMMetadataBuilder.h | 0 .../src/main/cpp/JVMTagMap.cpp | 0 {ktaglib => musikr}/src/main/cpp/JVMTagMap.h | 0 .../src/main/cpp/android.toolchain.cmake | 0 .../src/main/cpp/build_taglib.sh | 14 ++- {ktaglib => musikr}/src/main/cpp/ktaglib.cpp | 0 {ktaglib => musikr}/src/main/cpp/taglib | 0 .../org/oxycblt/ktaglib/AndroidInputStream.kt | 0 .../main/java/org/oxycblt/ktaglib/KTagLib.kt | 0 .../org/oxycblt/ktaglib/NativeInputStream.kt | 0 .../main/java/org/oxycblt/musikr/Config.kt | 0 .../main/java/org/oxycblt/musikr/Library.kt | 0 .../src/main/java/org/oxycblt/musikr/Music.kt | 0 .../main/java/org/oxycblt/musikr/Musikr.kt | 0 .../java/org/oxycblt/musikr/cache/Cache.kt | 0 .../org/oxycblt/musikr/cache/CacheDatabase.kt | 0 .../java/org/oxycblt/musikr/cover/Cover.kt | 0 .../org/oxycblt/musikr/cover/CoverFiles.kt | 0 .../org/oxycblt/musikr/cover/CoverFormat.kt | 0 .../oxycblt/musikr/cover/CoverIdentifier.kt | 0 .../org/oxycblt/musikr/cover/StoredCovers.kt | 0 .../main/java/org/oxycblt/musikr/fs/Format.kt | 0 .../org/oxycblt/musikr/fs/MusicLocation.kt | 0 .../main/java/org/oxycblt/musikr/fs/Path.kt | 0 .../musikr/fs/path/DocumentPathFactory.kt | 3 +- .../fs/path/MediaStorePathInterpreter.kt | 5 - .../oxycblt/musikr/fs/path/VolumeCompat.kt | 0 .../oxycblt/musikr/fs/path/VolumeManager.kt | 0 .../oxycblt/musikr/fs/query/DeviceFiles.kt | 0 .../org/oxycblt/musikr/fs/query/QueryUtil.kt | 0 .../org/oxycblt/musikr/graph/MusicGraph.kt | 2 - .../musikr/metadata/MetadataExtractor.kt | 0 .../org/oxycblt/musikr/model/AlbumImpl.kt | 0 .../org/oxycblt/musikr/model/ArtistImpl.kt | 0 .../org/oxycblt/musikr/model/GenreImpl.kt | 0 .../oxycblt/musikr/model/LibraryFactory.kt | 0 .../org/oxycblt/musikr/model/LibraryImpl.kt | 0 .../org/oxycblt/musikr/model/PlaylistImpl.kt | 0 .../java/org/oxycblt/musikr/model/SongImpl.kt | 0 .../oxycblt/musikr/pipeline/EvaluateStep.kt | 0 .../oxycblt/musikr/pipeline/ExploreStep.kt | 0 .../oxycblt/musikr/pipeline/ExtractStep.kt | 0 .../org/oxycblt/musikr/pipeline/FlowUtil.kt | 0 .../playlist/ExternalPlaylistManager.kt | 9 +- .../oxycblt/musikr/playlist/PlaylistFile.kt | 0 .../musikr/playlist/db/PlaylistDatabase.kt | 0 .../oxycblt/musikr/playlist/db/RawPlaylist.kt | 0 .../musikr/playlist/db/StoredPlaylists.kt | 0 .../org/oxycblt/musikr/playlist/m3u/M3U.kt | 12 +- .../main/java/org/oxycblt/musikr/tag/Date.kt | 0 .../main/java/org/oxycblt/musikr/tag/Disc.kt | 0 .../main/java/org/oxycblt/musikr/tag/Name.kt | 0 .../org/oxycblt/musikr/tag/ReleaseType.kt | 0 .../musikr/tag/ReplayGainAdjustment.kt | 0 .../oxycblt/musikr/tag/interpret/Naming.kt | 0 .../oxycblt/musikr/tag/interpret/PreMusic.kt | 0 .../musikr/tag/interpret/Separators.kt | 0 .../musikr/tag/interpret/TagInterpreter.kt | 0 .../org/oxycblt/musikr/tag/interpret/Token.kt | 0 .../musikr/tag/parse/ExoPlayerTagFields.kt | 0 .../oxycblt/musikr/tag/parse/ParsedTags.kt | 0 .../org/oxycblt/musikr/tag/parse/TagParser.kt | 0 .../java/org/oxycblt/musikr/tag/util/ID3.kt | 0 .../org/oxycblt/musikr/tag/util/Transform.kt | 0 .../org/oxycblt/musikr/tag/util/Vorbis.kt | 0 .../java/org/oxycblt/musikr/util/LangUtil.kt | 2 +- settings.gradle | 2 +- 84 files changed, 151 insertions(+), 286 deletions(-) delete mode 100644 app/src/main/java/org/oxycblt/musikr/metadata/AudioProperties.kt delete mode 100644 app/src/main/java/org/oxycblt/musikr/metadata/MetadataModule.kt rename ktaglib/consumer-rules.pro => musikr/.Rhistory (100%) rename {ktaglib => musikr}/.gitignore (100%) rename {ktaglib => musikr}/build.gradle (55%) create mode 100644 musikr/consumer-rules.pro rename {ktaglib => musikr}/proguard-rules.pro (100%) rename {ktaglib => musikr}/src/main/AndroidManifest.xml (100%) rename {ktaglib => musikr}/src/main/cpp/CMakeLists.txt (100%) rename {ktaglib => musikr}/src/main/cpp/JVMInputStream.cpp (100%) rename {ktaglib => musikr}/src/main/cpp/JVMInputStream.h (99%) rename {ktaglib => musikr}/src/main/cpp/JVMMetadataBuilder.cpp (100%) rename {ktaglib => musikr}/src/main/cpp/JVMMetadataBuilder.h (100%) rename {ktaglib => musikr}/src/main/cpp/JVMTagMap.cpp (100%) rename {ktaglib => musikr}/src/main/cpp/JVMTagMap.h (100%) rename {ktaglib => musikr}/src/main/cpp/android.toolchain.cmake (100%) rename {ktaglib => musikr}/src/main/cpp/build_taglib.sh (82%) rename {ktaglib => musikr}/src/main/cpp/ktaglib.cpp (100%) rename {ktaglib => musikr}/src/main/cpp/taglib (100%) rename {ktaglib => musikr}/src/main/java/org/oxycblt/ktaglib/AndroidInputStream.kt (100%) rename {ktaglib => musikr}/src/main/java/org/oxycblt/ktaglib/KTagLib.kt (100%) rename {ktaglib => musikr}/src/main/java/org/oxycblt/ktaglib/NativeInputStream.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/Config.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/Library.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/Music.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/Musikr.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/cache/Cache.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/cache/CacheDatabase.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/cover/Cover.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/cover/CoverIdentifier.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/Format.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/MusicLocation.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/Path.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/path/DocumentPathFactory.kt (98%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/path/MediaStorePathInterpreter.kt (97%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/path/VolumeCompat.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/path/VolumeManager.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/query/DeviceFiles.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/fs/query/QueryUtil.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt (98%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/metadata/MetadataExtractor.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/model/LibraryImpl.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/model/SongImpl.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/pipeline/FlowUtil.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/playlist/ExternalPlaylistManager.kt (94%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/playlist/PlaylistFile.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/playlist/db/PlaylistDatabase.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/playlist/db/RawPlaylist.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/playlist/db/StoredPlaylists.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/playlist/m3u/M3U.kt (96%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/Date.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/Disc.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/Name.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/ReleaseType.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/ReplayGainAdjustment.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/interpret/Naming.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/interpret/Separators.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/interpret/Token.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/parse/ExoPlayerTagFields.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/parse/ParsedTags.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/util/ID3.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/util/Transform.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/tag/util/Vorbis.kt (100%) rename {app => musikr}/src/main/java/org/oxycblt/musikr/util/LangUtil.kt (99%) diff --git a/.gitmodules b/.gitmodules index b4b8a2838..55d1a1cbd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,8 @@ [submodule "media"] path = media url = https://github.com/OxygenCobalt/media.git -[submodule "taglib"] - path = ktaglib/src/main/cpp/taglib + +[submodule "musikr/src/main/cpp/taglib"] + path = musikr/src/main/cpp/taglib url = https://github.com/taglib/taglib.git tag = v2.0.2 diff --git a/app/build.gradle b/app/build.gradle index 797514eeb..0d139a1d9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,6 @@ plugins { id "com.android.application" id "kotlin-android" id "androidx.navigation.safeargs.kotlin" - id "com.diffplug.spotless" id "kotlin-parcelize" id "dagger.hilt.android.plugin" id "kotlin-kapt" @@ -12,11 +11,9 @@ plugins { android { compileSdk 35 - // NDK is not used in Auxio explicitly (used in the ffmpeg extension), but we need to specify - // it here so that binary stripping will work. - // TODO: Eventually you might just want to start vendoring the FFMpeg extension so the - // NDK use is unified - ndkVersion "26.3.11579264" + // Auxio implicitly depends on the native modules, explicitly specify it + // here so the libraries are still stripped. + ndkVersion ndk_version namespace "org.oxycblt.auxio" defaultConfig { @@ -24,8 +21,8 @@ android { versionName "3.6.3" versionCode 53 - minSdk 24 - targetSdk 35 + minSdk target_sdk + targetSdk target_sdk testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -80,9 +77,8 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - def coroutines_version = '1.7.2' - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:$coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-guava:$kotlin_coroutines_version" // --- SUPPORT --- @@ -125,20 +121,23 @@ dependencies { implementation "androidx.preference:preference-ktx:1.2.1" // Database - def room_version = '2.6.1' implementation "androidx.room:room-runtime:$room_version" ksp "androidx.room:room-compiler:$room_version" implementation "androidx.room:room-ktx:$room_version" + // Build + coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.1.3" + + // --- SECOND PARTY --- + + // Musikr + implementation project(":musikr") + // --- THIRD PARTY --- // Exoplayer (Vendored) implementation project(":media-lib-exoplayer") implementation project(":media-lib-decoder-ffmpeg") - coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.1.3" - - // Taglib - implementation project(":ktaglib") // Image loading implementation 'io.coil-kt.coil3:coil-core:3.0.2' @@ -175,15 +174,3 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.2.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' } - -spotless { - kotlin { - target "src/**/*.kt" - ktfmt().dropboxStyle() - licenseHeaderFile("NOTICE") - } -} - -afterEvaluate { - preDebugBuild.dependsOn spotlessApply -} 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 d514db4cf..a03b5d69a 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailViewModel.kt @@ -54,7 +54,6 @@ import org.oxycblt.musikr.Music import org.oxycblt.musikr.MusicParent import org.oxycblt.musikr.Playlist import org.oxycblt.musikr.Song -import org.oxycblt.musikr.metadata.AudioProperties import timber.log.Timber as L /** @@ -69,7 +68,6 @@ class DetailViewModel constructor( private val listSettings: ListSettings, private val musicRepository: MusicRepository, - private val audioPropertiesFactory: AudioProperties.Factory, private val playbackSettings: PlaybackSettings, detailGeneratorFactory: DetailGenerator.Factory ) : ViewModel(), DetailGenerator.Invalidator { @@ -89,10 +87,6 @@ constructor( val currentSong: StateFlow get() = _currentSong - private val _songAudioProperties = MutableStateFlow(null) - /** The [AudioProperties] of the currently shown [Song]. Null if not loaded yet. */ - val songAudioProperties: StateFlow = _songAudioProperties - // --- ALBUM --- private val _currentAlbum = MutableStateFlow(null) @@ -308,7 +302,7 @@ constructor( } /** - * Set a new [currentSong] from it's [Music.UID]. [currentSong] and [songAudioProperties] will + * Set a new [currentSong] from it's [Music.UID]. [currentSong] will * be updated to align with the new [Song]. * * @param uid The UID of the [Song] to load. Must be valid. @@ -511,17 +505,7 @@ constructor( } private fun refreshAudioInfo(song: Song) { - L.d("Refreshing audio info") - // Clear any previous job in order to avoid stale data from appearing in the UI. - currentSongJob?.cancel() - _songAudioProperties.value = null - currentSongJob = - viewModelScope.launch(Dispatchers.IO) { - val info = audioPropertiesFactory.extract(song) - yield() - L.d("Updating audio info to $info") - _songAudioProperties.value = info - } + } private inline fun refreshDetail( diff --git a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt index 76dfc2606..c558001f1 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/SongDetailDialog.kt @@ -41,7 +41,6 @@ import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.concatLocalized import org.oxycblt.musikr.Music import org.oxycblt.musikr.Song -import org.oxycblt.musikr.metadata.AudioProperties import org.oxycblt.musikr.tag.Name import timber.log.Timber as L @@ -72,63 +71,63 @@ class SongDetailDialog : ViewBindingMaterialDialogFragment T.zipName(context: Context): String { diff --git a/app/src/main/java/org/oxycblt/musikr/metadata/AudioProperties.kt b/app/src/main/java/org/oxycblt/musikr/metadata/AudioProperties.kt deleted file mode 100644 index 4445fe99a..000000000 --- a/app/src/main/java/org/oxycblt/musikr/metadata/AudioProperties.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2023 Auxio Project - * AudioProperties.kt is part of Auxio. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.oxycblt.musikr.metadata - -import android.content.Context -import android.media.MediaExtractor -import android.media.MediaFormat -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import org.oxycblt.musikr.Song -import timber.log.Timber as L - -/** - * The properties of a [Song]'s file. - * - * @param bitrateKbps The bit rate, in kilobytes-per-second. Null if it could not be parsed. - * @param sampleRateHz The sample rate, in hertz. - * @author Alexander Capehart (OxygenCobalt) - */ -data class AudioProperties(val bitrateKbps: Int?, val sampleRateHz: Int?) { - /** Implements the process of extracting [AudioProperties] from a given [Song]. */ - interface Factory { - /** - * Extract the [AudioProperties] of a given [Song]. - * - * @param song The [Song] to read. - * @return The [AudioProperties] of the [Song], if possible to obtain. - */ - suspend fun extract(song: Song): AudioProperties - } -} - -/** - * A framework-backed implementation of [AudioProperties.Factory]. - * - * @param context [Context] required to read audio files. - */ -class AudioPropertiesFactoryImpl -@Inject -constructor(@ApplicationContext private val context: Context) : AudioProperties.Factory { - - override suspend fun extract(song: Song): AudioProperties { - // While we would use ExoPlayer to extract this information, it doesn't support - // common data like bit rate in progressive data sources due to there being no - // demand. Thus, we are stuck with the inferior OS-provided MediaExtractor. - val extractor = MediaExtractor() - - try { - extractor.setDataSource(context, song.uri, emptyMap()) - } catch (e: Exception) { - // Can feasibly fail with invalid file formats. Note that this isn't considered - // an error condition in the UI, as there is still plenty of other song information - // that we can show. - L.w("Unable to extract song attributes.") - L.w(e.stackTraceToString()) - return AudioProperties(null, null) - } - - // Get the first track from the extractor (This is basically always the only - // track we need to analyze). - val format = extractor.getTrackFormat(0) - - // Accessing fields can throw an exception if the fields are not present, and - // the new method for using default values is not available on lower API levels. - // So, we are forced to handle the exception and map it to a saner null value. - val bitrate = - try { - // Convert bytes-per-second to kilobytes-per-second. - format.getInteger(MediaFormat.KEY_BIT_RATE) / 1000 - } catch (e: NullPointerException) { - L.d("Unable to extract bit rate field") - null - } - - val sampleRate = - try { - format.getInteger(MediaFormat.KEY_SAMPLE_RATE) - } catch (e: NullPointerException) { - L.e("Unable to extract sample rate field") - null - } - - extractor.release() - - L.d("Finished extracting audio properties") - - return AudioProperties(bitrate, sampleRate) - } -} diff --git a/app/src/main/java/org/oxycblt/musikr/metadata/MetadataModule.kt b/app/src/main/java/org/oxycblt/musikr/metadata/MetadataModule.kt deleted file mode 100644 index 5687b798d..000000000 --- a/app/src/main/java/org/oxycblt/musikr/metadata/MetadataModule.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2023 Auxio Project - * MetadataModule.kt is part of Auxio. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.oxycblt.musikr.metadata - -import dagger.Binds -import dagger.Module -import dagger.hilt.InstallIn -import dagger.hilt.components.SingletonComponent - -@Module -@InstallIn(SingletonComponent::class) -interface MetadataModule { - @Binds - fun audioPropertiesFactory(interpreter: AudioPropertiesFactoryImpl): AudioProperties.Factory -} diff --git a/build.gradle b/build.gradle index 5f4731e48..0825d0afe 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,16 @@ buildscript { ext { + agp_version = '8.7.3' kotlin_version = '2.0.21' + kotlin_coroutines_version = '1.7.2' navigation_version = "2.8.3" hilt_version = '2.51.1' + room_version = '2.6.1' + + min_sdk = 24 + target_sdk = 35 + ndk_version = "27.2.12479018" + } dependencies { @@ -12,14 +20,27 @@ buildscript { } plugins { - id "com.android.application" version '8.7.2' apply false + // Android studio doesn't understand this syntax + //noinspection GradlePluginVersion + id "com.android.application" version "$agp_version" apply false id "androidx.navigation.safeargs.kotlin" version "$navigation_version" apply false + //noinspection GradlePluginVersion + id 'com.android.library' version "$agp_version" apply false id "org.jetbrains.kotlin.android" version "$kotlin_version" apply false id "com.google.devtools.ksp" version '2.0.21-1.0.25' apply false - id "com.diffplug.spotless" version "6.25.0" apply false - id 'com.android.library' version '8.7.2' apply false + id "com.diffplug.spotless" version "6.25.0" apply true } -tasks.register('clean', Delete) { - delete rootProject.buildDir -} \ No newline at end of file +spotless { + kotlin { + target "*/src/**/*.kt" + ktfmt().dropboxStyle() + licenseHeaderFile("NOTICE") + } + + cpp { + target "*/src/**/*.cpp" + clangFormat() + licenseHeaderFile("NOTICE") + } +} diff --git a/ktaglib/consumer-rules.pro b/musikr/.Rhistory similarity index 100% rename from ktaglib/consumer-rules.pro rename to musikr/.Rhistory diff --git a/ktaglib/.gitignore b/musikr/.gitignore similarity index 100% rename from ktaglib/.gitignore rename to musikr/.gitignore diff --git a/ktaglib/build.gradle b/musikr/build.gradle similarity index 55% rename from ktaglib/build.gradle rename to musikr/build.gradle index 5041225d0..3b766d184 100644 --- a/ktaglib/build.gradle +++ b/musikr/build.gradle @@ -3,15 +3,19 @@ import org.apache.tools.ant.taskdefs.condition.Os plugins { id 'com.android.library' id 'org.jetbrains.kotlin.android' + id "com.google.devtools.ksp" + id "com.diffplug.spotless" + id "kotlin-parcelize" } android { - namespace 'org.oxycblt.ktaglib' - compileSdk 34 - ndkVersion "26.3.11579264" + namespace 'org.oxycblt.musikr' + compileSdk target_sdk + ndkVersion "$ndk_version" defaultConfig { - minSdk 24 + minSdk min_sdk + targetSdk target_sdk testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" @@ -28,19 +32,45 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.22.1" } } + compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + coreLibraryDesugaringEnabled true + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } + kotlinOptions { - jvmTarget = '11' + jvmTarget = "17" + freeCompilerArgs += "-Xjvm-default=all" } + + buildFeatures { + buildConfig true + } +} + +dependencies { + // Kotlin + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" + + // AndroidX + implementation "androidx.core:core-ktx:1.15.0" + + // Database + implementation "androidx.room:room-runtime:$room_version" + ksp "androidx.room:room-compiler:$room_version" + implementation "androidx.room:room-ktx:$room_version" + + // Build + coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.1.3" } task assembleTaglib(type: Exec) { diff --git a/musikr/consumer-rules.pro b/musikr/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/ktaglib/proguard-rules.pro b/musikr/proguard-rules.pro similarity index 100% rename from ktaglib/proguard-rules.pro rename to musikr/proguard-rules.pro diff --git a/ktaglib/src/main/AndroidManifest.xml b/musikr/src/main/AndroidManifest.xml similarity index 100% rename from ktaglib/src/main/AndroidManifest.xml rename to musikr/src/main/AndroidManifest.xml diff --git a/ktaglib/src/main/cpp/CMakeLists.txt b/musikr/src/main/cpp/CMakeLists.txt similarity index 100% rename from ktaglib/src/main/cpp/CMakeLists.txt rename to musikr/src/main/cpp/CMakeLists.txt diff --git a/ktaglib/src/main/cpp/JVMInputStream.cpp b/musikr/src/main/cpp/JVMInputStream.cpp similarity index 100% rename from ktaglib/src/main/cpp/JVMInputStream.cpp rename to musikr/src/main/cpp/JVMInputStream.cpp diff --git a/ktaglib/src/main/cpp/JVMInputStream.h b/musikr/src/main/cpp/JVMInputStream.h similarity index 99% rename from ktaglib/src/main/cpp/JVMInputStream.h rename to musikr/src/main/cpp/JVMInputStream.h index a35a1e631..d05564b0a 100644 --- a/ktaglib/src/main/cpp/JVMInputStream.h +++ b/musikr/src/main/cpp/JVMInputStream.h @@ -80,7 +80,7 @@ public: /*! * Reset the end-of-stream and error flags on the stream. */ - void clear(); + void clear() override; /*! * Returns the current offset within the stream. diff --git a/ktaglib/src/main/cpp/JVMMetadataBuilder.cpp b/musikr/src/main/cpp/JVMMetadataBuilder.cpp similarity index 100% rename from ktaglib/src/main/cpp/JVMMetadataBuilder.cpp rename to musikr/src/main/cpp/JVMMetadataBuilder.cpp diff --git a/ktaglib/src/main/cpp/JVMMetadataBuilder.h b/musikr/src/main/cpp/JVMMetadataBuilder.h similarity index 100% rename from ktaglib/src/main/cpp/JVMMetadataBuilder.h rename to musikr/src/main/cpp/JVMMetadataBuilder.h diff --git a/ktaglib/src/main/cpp/JVMTagMap.cpp b/musikr/src/main/cpp/JVMTagMap.cpp similarity index 100% rename from ktaglib/src/main/cpp/JVMTagMap.cpp rename to musikr/src/main/cpp/JVMTagMap.cpp diff --git a/ktaglib/src/main/cpp/JVMTagMap.h b/musikr/src/main/cpp/JVMTagMap.h similarity index 100% rename from ktaglib/src/main/cpp/JVMTagMap.h rename to musikr/src/main/cpp/JVMTagMap.h diff --git a/ktaglib/src/main/cpp/android.toolchain.cmake b/musikr/src/main/cpp/android.toolchain.cmake similarity index 100% rename from ktaglib/src/main/cpp/android.toolchain.cmake rename to musikr/src/main/cpp/android.toolchain.cmake diff --git a/ktaglib/src/main/cpp/build_taglib.sh b/musikr/src/main/cpp/build_taglib.sh similarity index 82% rename from ktaglib/src/main/cpp/build_taglib.sh rename to musikr/src/main/cpp/build_taglib.sh index 662217fcd..a731ba804 100755 --- a/ktaglib/src/main/cpp/build_taglib.sh +++ b/musikr/src/main/cpp/build_taglib.sh @@ -27,14 +27,16 @@ build_for_arch() { cd $TAGLIB_SRC_DIR cmake -B $DST_DIR -DANDROID_NDK_PATH=${NDK_PATH} -DCMAKE_TOOLCHAIN_FILE=${NDK_TOOLCHAIN} \ -DANDROID_ABI=$ARCH -DBUILD_SHARED_LIBS=OFF -DVISIBILITY_HIDDEN=ON -DBUILD_TESTING=OFF \ - -DBUILD_EXAMPLES=OFF -DBUILD_BINDINGS=OFF -DWITH_ZLIB=OFF -DCMAKE_BUILD_TYPE=Release - cmake --build $DST_DIR --config Release + -DBUILD_EXAMPLES=OFF -DBUILD_BINDINGS=OFF -DWITH_ZLIB=OFF -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS="-fPIC" + cmake --build $DST_DIR --config Release -j$(nproc) cd $WORKING_DIR cmake --install $DST_DIR --config Release --prefix $PKG_DIR --strip } -build_for_arch $X86_ARCH -build_for_arch $X86_64_ARCH -build_for_arch $ARMV7_ARCH -build_for_arch $ARMV8_ARCH \ No newline at end of file +build_for_arch $X86_ARCH& +build_for_arch $X86_64_ARCH& +build_for_arch $ARMV7_ARCH& +build_for_arch $ARMV8_ARCH& +wait \ No newline at end of file diff --git a/ktaglib/src/main/cpp/ktaglib.cpp b/musikr/src/main/cpp/ktaglib.cpp similarity index 100% rename from ktaglib/src/main/cpp/ktaglib.cpp rename to musikr/src/main/cpp/ktaglib.cpp diff --git a/ktaglib/src/main/cpp/taglib b/musikr/src/main/cpp/taglib similarity index 100% rename from ktaglib/src/main/cpp/taglib rename to musikr/src/main/cpp/taglib diff --git a/ktaglib/src/main/java/org/oxycblt/ktaglib/AndroidInputStream.kt b/musikr/src/main/java/org/oxycblt/ktaglib/AndroidInputStream.kt similarity index 100% rename from ktaglib/src/main/java/org/oxycblt/ktaglib/AndroidInputStream.kt rename to musikr/src/main/java/org/oxycblt/ktaglib/AndroidInputStream.kt diff --git a/ktaglib/src/main/java/org/oxycblt/ktaglib/KTagLib.kt b/musikr/src/main/java/org/oxycblt/ktaglib/KTagLib.kt similarity index 100% rename from ktaglib/src/main/java/org/oxycblt/ktaglib/KTagLib.kt rename to musikr/src/main/java/org/oxycblt/ktaglib/KTagLib.kt diff --git a/ktaglib/src/main/java/org/oxycblt/ktaglib/NativeInputStream.kt b/musikr/src/main/java/org/oxycblt/ktaglib/NativeInputStream.kt similarity index 100% rename from ktaglib/src/main/java/org/oxycblt/ktaglib/NativeInputStream.kt rename to musikr/src/main/java/org/oxycblt/ktaglib/NativeInputStream.kt diff --git a/app/src/main/java/org/oxycblt/musikr/Config.kt b/musikr/src/main/java/org/oxycblt/musikr/Config.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/Config.kt rename to musikr/src/main/java/org/oxycblt/musikr/Config.kt diff --git a/app/src/main/java/org/oxycblt/musikr/Library.kt b/musikr/src/main/java/org/oxycblt/musikr/Library.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/Library.kt rename to musikr/src/main/java/org/oxycblt/musikr/Library.kt diff --git a/app/src/main/java/org/oxycblt/musikr/Music.kt b/musikr/src/main/java/org/oxycblt/musikr/Music.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/Music.kt rename to musikr/src/main/java/org/oxycblt/musikr/Music.kt diff --git a/app/src/main/java/org/oxycblt/musikr/Musikr.kt b/musikr/src/main/java/org/oxycblt/musikr/Musikr.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/Musikr.kt rename to musikr/src/main/java/org/oxycblt/musikr/Musikr.kt diff --git a/app/src/main/java/org/oxycblt/musikr/cache/Cache.kt b/musikr/src/main/java/org/oxycblt/musikr/cache/Cache.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/cache/Cache.kt rename to musikr/src/main/java/org/oxycblt/musikr/cache/Cache.kt diff --git a/app/src/main/java/org/oxycblt/musikr/cache/CacheDatabase.kt b/musikr/src/main/java/org/oxycblt/musikr/cache/CacheDatabase.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/cache/CacheDatabase.kt rename to musikr/src/main/java/org/oxycblt/musikr/cache/CacheDatabase.kt diff --git a/app/src/main/java/org/oxycblt/musikr/cover/Cover.kt b/musikr/src/main/java/org/oxycblt/musikr/cover/Cover.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/cover/Cover.kt rename to musikr/src/main/java/org/oxycblt/musikr/cover/Cover.kt diff --git a/app/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt rename to musikr/src/main/java/org/oxycblt/musikr/cover/CoverFiles.kt diff --git a/app/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt rename to musikr/src/main/java/org/oxycblt/musikr/cover/CoverFormat.kt diff --git a/app/src/main/java/org/oxycblt/musikr/cover/CoverIdentifier.kt b/musikr/src/main/java/org/oxycblt/musikr/cover/CoverIdentifier.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/cover/CoverIdentifier.kt rename to musikr/src/main/java/org/oxycblt/musikr/cover/CoverIdentifier.kt diff --git a/app/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt b/musikr/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt rename to musikr/src/main/java/org/oxycblt/musikr/cover/StoredCovers.kt diff --git a/app/src/main/java/org/oxycblt/musikr/fs/Format.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/Format.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/fs/Format.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/Format.kt diff --git a/app/src/main/java/org/oxycblt/musikr/fs/MusicLocation.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/MusicLocation.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/fs/MusicLocation.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/MusicLocation.kt diff --git a/app/src/main/java/org/oxycblt/musikr/fs/Path.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/Path.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/fs/Path.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/Path.kt diff --git a/app/src/main/java/org/oxycblt/musikr/fs/path/DocumentPathFactory.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/path/DocumentPathFactory.kt similarity index 98% rename from app/src/main/java/org/oxycblt/musikr/fs/path/DocumentPathFactory.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/path/DocumentPathFactory.kt index f92af58dc..60582fb02 100644 --- a/app/src/main/java/org/oxycblt/musikr/fs/path/DocumentPathFactory.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/fs/path/DocumentPathFactory.kt @@ -22,7 +22,6 @@ import android.content.ContentUris import android.content.Context import android.net.Uri import android.provider.DocumentsContract -import dagger.hilt.android.qualifiers.ApplicationContext import java.io.File import org.oxycblt.musikr.fs.Components import org.oxycblt.musikr.fs.Path @@ -78,7 +77,7 @@ interface DocumentPathFactory { } private class DocumentPathFactoryImpl( - @ApplicationContext private val context: Context, + private val context: Context, private val volumeManager: VolumeManager, private val mediaStorePathInterpreterFactory: MediaStorePathInterpreter.Factory ) : DocumentPathFactory { diff --git a/app/src/main/java/org/oxycblt/musikr/fs/path/MediaStorePathInterpreter.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/path/MediaStorePathInterpreter.kt similarity index 97% rename from app/src/main/java/org/oxycblt/musikr/fs/path/MediaStorePathInterpreter.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/path/MediaStorePathInterpreter.kt index 5c505f2eb..59e14f111 100644 --- a/app/src/main/java/org/oxycblt/musikr/fs/path/MediaStorePathInterpreter.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/fs/path/MediaStorePathInterpreter.kt @@ -23,7 +23,6 @@ import android.os.Build import android.provider.MediaStore import org.oxycblt.musikr.fs.Components import org.oxycblt.musikr.fs.Path -import timber.log.Timber as L /** * Wrapper around a [Cursor] that interprets path information on a per-API/manufacturer basis. @@ -114,8 +113,6 @@ private constructor(private val cursor: Cursor, volumeManager: VolumeManager) : } } - L.e("Could not find volume for $data [tried: ${volumes.map { it.components }}]") - return null } @@ -183,8 +180,6 @@ private constructor(private val cursor: Cursor, volumeManager: VolumeManager) : val displayName = cursor.getString(displayNameIndex) val volume = volumes.find { it.mediaStoreName == volumeName } if (volume == null) { - L.e( - "Could not find volume for $volumeName:$relativePath/$displayName [tried: ${volumes.map { it.mediaStoreName }}]") return null } val components = Components.parseUnix(relativePath).child(displayName) diff --git a/app/src/main/java/org/oxycblt/musikr/fs/path/VolumeCompat.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/path/VolumeCompat.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/fs/path/VolumeCompat.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/path/VolumeCompat.kt diff --git a/app/src/main/java/org/oxycblt/musikr/fs/path/VolumeManager.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/path/VolumeManager.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/fs/path/VolumeManager.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/path/VolumeManager.kt diff --git a/app/src/main/java/org/oxycblt/musikr/fs/query/DeviceFiles.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/query/DeviceFiles.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/fs/query/DeviceFiles.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/query/DeviceFiles.kt diff --git a/app/src/main/java/org/oxycblt/musikr/fs/query/QueryUtil.kt b/musikr/src/main/java/org/oxycblt/musikr/fs/query/QueryUtil.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/fs/query/QueryUtil.kt rename to musikr/src/main/java/org/oxycblt/musikr/fs/query/QueryUtil.kt diff --git a/app/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt b/musikr/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt similarity index 98% rename from app/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt rename to musikr/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt index 99df6f3e1..3aaed1d23 100644 --- a/app/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/graph/MusicGraph.kt @@ -24,7 +24,6 @@ import org.oxycblt.musikr.tag.interpret.PreArtist import org.oxycblt.musikr.tag.interpret.PreGenre import org.oxycblt.musikr.tag.interpret.PreSong import org.oxycblt.musikr.util.unlikelyToBeNull -import timber.log.Timber as L data class MusicGraph( val songVertex: List, @@ -52,7 +51,6 @@ private class MusicGraphBuilderImpl : MusicGraph.Builder { override fun add(preSong: PreSong) { val uid = preSong.computeUid() if (songVertices.containsKey(uid)) { - L.d("Song ${preSong.path} already in graph at ${songVertices[uid]?.preSong?.path}") return } diff --git a/app/src/main/java/org/oxycblt/musikr/metadata/MetadataExtractor.kt b/musikr/src/main/java/org/oxycblt/musikr/metadata/MetadataExtractor.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/metadata/MetadataExtractor.kt rename to musikr/src/main/java/org/oxycblt/musikr/metadata/MetadataExtractor.kt diff --git a/app/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt rename to musikr/src/main/java/org/oxycblt/musikr/model/AlbumImpl.kt diff --git a/app/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt rename to musikr/src/main/java/org/oxycblt/musikr/model/ArtistImpl.kt diff --git a/app/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt rename to musikr/src/main/java/org/oxycblt/musikr/model/GenreImpl.kt diff --git a/app/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt b/musikr/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt rename to musikr/src/main/java/org/oxycblt/musikr/model/LibraryFactory.kt diff --git a/app/src/main/java/org/oxycblt/musikr/model/LibraryImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/LibraryImpl.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/model/LibraryImpl.kt rename to musikr/src/main/java/org/oxycblt/musikr/model/LibraryImpl.kt diff --git a/app/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt rename to musikr/src/main/java/org/oxycblt/musikr/model/PlaylistImpl.kt diff --git a/app/src/main/java/org/oxycblt/musikr/model/SongImpl.kt b/musikr/src/main/java/org/oxycblt/musikr/model/SongImpl.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/model/SongImpl.kt rename to musikr/src/main/java/org/oxycblt/musikr/model/SongImpl.kt diff --git a/app/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt b/musikr/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt rename to musikr/src/main/java/org/oxycblt/musikr/pipeline/EvaluateStep.kt diff --git a/app/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt b/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt rename to musikr/src/main/java/org/oxycblt/musikr/pipeline/ExploreStep.kt diff --git a/app/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt b/musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt rename to musikr/src/main/java/org/oxycblt/musikr/pipeline/ExtractStep.kt diff --git a/app/src/main/java/org/oxycblt/musikr/pipeline/FlowUtil.kt b/musikr/src/main/java/org/oxycblt/musikr/pipeline/FlowUtil.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/pipeline/FlowUtil.kt rename to musikr/src/main/java/org/oxycblt/musikr/pipeline/FlowUtil.kt diff --git a/app/src/main/java/org/oxycblt/musikr/playlist/ExternalPlaylistManager.kt b/musikr/src/main/java/org/oxycblt/musikr/playlist/ExternalPlaylistManager.kt similarity index 94% rename from app/src/main/java/org/oxycblt/musikr/playlist/ExternalPlaylistManager.kt rename to musikr/src/main/java/org/oxycblt/musikr/playlist/ExternalPlaylistManager.kt index 52fec8005..e4fe86dcc 100644 --- a/app/src/main/java/org/oxycblt/musikr/playlist/ExternalPlaylistManager.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/playlist/ExternalPlaylistManager.kt @@ -26,7 +26,6 @@ import org.oxycblt.musikr.fs.Path import org.oxycblt.musikr.fs.path.DocumentPathFactory import org.oxycblt.musikr.fs.query.contentResolverSafe import org.oxycblt.musikr.playlist.m3u.M3U -import timber.log.Timber as L /** * Generic playlist file importing abstraction. @@ -111,7 +110,6 @@ class ExternalPlaylistManagerImpl( return ImportedPlaylist(newName, imported.paths) } } catch (e: Exception) { - L.e("Failed to import playlist: $e") null } } @@ -125,17 +123,12 @@ class ExternalPlaylistManagerImpl( filePath.directory } return try { - val outputStream = context.contentResolverSafe.openOutputStream(uri) - if (outputStream == null) { - L.e("Failed to export playlist: Could not open output stream") - return false - } + val outputStream = context.contentResolverSafe.openOutputStream(uri) ?: return false outputStream.use { m3u.write(playlist, it, workingDirectory, config) true } } catch (e: Exception) { - L.e("Failed to export playlist: $e") false } } diff --git a/app/src/main/java/org/oxycblt/musikr/playlist/PlaylistFile.kt b/musikr/src/main/java/org/oxycblt/musikr/playlist/PlaylistFile.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/playlist/PlaylistFile.kt rename to musikr/src/main/java/org/oxycblt/musikr/playlist/PlaylistFile.kt diff --git a/app/src/main/java/org/oxycblt/musikr/playlist/db/PlaylistDatabase.kt b/musikr/src/main/java/org/oxycblt/musikr/playlist/db/PlaylistDatabase.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/playlist/db/PlaylistDatabase.kt rename to musikr/src/main/java/org/oxycblt/musikr/playlist/db/PlaylistDatabase.kt diff --git a/app/src/main/java/org/oxycblt/musikr/playlist/db/RawPlaylist.kt b/musikr/src/main/java/org/oxycblt/musikr/playlist/db/RawPlaylist.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/playlist/db/RawPlaylist.kt rename to musikr/src/main/java/org/oxycblt/musikr/playlist/db/RawPlaylist.kt diff --git a/app/src/main/java/org/oxycblt/musikr/playlist/db/StoredPlaylists.kt b/musikr/src/main/java/org/oxycblt/musikr/playlist/db/StoredPlaylists.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/playlist/db/StoredPlaylists.kt rename to musikr/src/main/java/org/oxycblt/musikr/playlist/db/StoredPlaylists.kt diff --git a/app/src/main/java/org/oxycblt/musikr/playlist/m3u/M3U.kt b/musikr/src/main/java/org/oxycblt/musikr/playlist/m3u/M3U.kt similarity index 96% rename from app/src/main/java/org/oxycblt/musikr/playlist/m3u/M3U.kt rename to musikr/src/main/java/org/oxycblt/musikr/playlist/m3u/M3U.kt index 3c473ac03..c11734db8 100644 --- a/app/src/main/java/org/oxycblt/musikr/playlist/m3u/M3U.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/playlist/m3u/M3U.kt @@ -19,7 +19,6 @@ package org.oxycblt.musikr.playlist.m3u import android.content.Context -import dagger.hilt.android.qualifiers.ApplicationContext import java.io.BufferedReader import java.io.BufferedWriter import java.io.InputStream @@ -36,7 +35,6 @@ import org.oxycblt.musikr.playlist.PossiblePaths import org.oxycblt.musikr.tag.Name import org.oxycblt.musikr.tag.util.correctWhitespace import org.oxycblt.musikr.util.unlikelyToBeNull -import timber.log.Timber as L /** * Minimal M3U file format implementation. @@ -75,12 +73,11 @@ interface M3U { /** The mime type used for M3U files by the android system. */ const val MIME_TYPE = "audio/x-mpegurl" - fun from(context: Context): M3U = M3UImpl(context, VolumeManager.from(context)) + fun from(context: Context): M3U = M3UImpl(VolumeManager.from(context)) } } private class M3UImpl( - @ApplicationContext private val context: Context, private val volumeManager: VolumeManager ) : M3U { override fun read(stream: InputStream, workingDirectory: Path): ImportedPlaylist? { @@ -117,15 +114,10 @@ private class M3UImpl( } } - if (path == null) { - L.e("Expected a path, instead got an EOF") - break@consumeFile - } - // There is basically no formal specification of file paths in M3U, and it differs // based on the programs that generated it. I more or less have to consider any possible // interpretation as valid. - val interpretations = interpretPath(path) + val interpretations = interpretPath(unlikelyToBeNull(path)) val possibilities = interpretations.flatMap { expandInterpretation(it, workingDirectory, volumes) } diff --git a/app/src/main/java/org/oxycblt/musikr/tag/Date.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/Date.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/Date.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/Date.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/Disc.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/Disc.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/Disc.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/Disc.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/Name.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/Name.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/Name.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/Name.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/ReleaseType.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/ReleaseType.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/ReleaseType.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/ReleaseType.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/ReplayGainAdjustment.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/ReplayGainAdjustment.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/ReplayGainAdjustment.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/ReplayGainAdjustment.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/interpret/Naming.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/Naming.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/interpret/Naming.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/interpret/Naming.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/interpret/PreMusic.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/interpret/Separators.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/Separators.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/interpret/Separators.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/interpret/Separators.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/interpret/TagInterpreter.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/interpret/Token.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/interpret/Token.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/interpret/Token.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/interpret/Token.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/parse/ExoPlayerTagFields.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/parse/ExoPlayerTagFields.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/parse/ExoPlayerTagFields.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/parse/ExoPlayerTagFields.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/parse/ParsedTags.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/parse/ParsedTags.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/parse/ParsedTags.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/parse/ParsedTags.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/util/ID3.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/util/ID3.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/util/ID3.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/util/ID3.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/util/Transform.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/util/Transform.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/util/Transform.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/util/Transform.kt diff --git a/app/src/main/java/org/oxycblt/musikr/tag/util/Vorbis.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/util/Vorbis.kt similarity index 100% rename from app/src/main/java/org/oxycblt/musikr/tag/util/Vorbis.kt rename to musikr/src/main/java/org/oxycblt/musikr/tag/util/Vorbis.kt diff --git a/app/src/main/java/org/oxycblt/musikr/util/LangUtil.kt b/musikr/src/main/java/org/oxycblt/musikr/util/LangUtil.kt similarity index 99% rename from app/src/main/java/org/oxycblt/musikr/util/LangUtil.kt rename to musikr/src/main/java/org/oxycblt/musikr/util/LangUtil.kt index dc804164f..bae4960b9 100644 --- a/app/src/main/java/org/oxycblt/musikr/util/LangUtil.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/util/LangUtil.kt @@ -21,7 +21,7 @@ package org.oxycblt.musikr.util import java.security.MessageDigest import java.util.UUID import kotlin.reflect.KClass -import org.oxycblt.auxio.BuildConfig +import org.oxycblt.musikr.BuildConfig import org.oxycblt.musikr.tag.Date /** diff --git a/settings.gradle b/settings.gradle index 4dfc02e2e..9b399cca7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -20,4 +20,4 @@ apply from: file("media/core_settings.gradle") rootProject.name = "Auxio" include ':app' -include ':ktaglib' +include ':musikr'