diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 21b70cf..134fd83 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.kotlin.android) alias(libs.plugins.compose.compiler) id("org.jetbrains.kotlin.plugin.serialization") version "2.0.20" + id("com.google.devtools.ksp") } android { @@ -64,6 +65,12 @@ dependencies { implementation(libs.androidx.media3.ui) implementation(libs.androidx.media3.common) implementation(libs.androidx.media3.session) + implementation(libs.androidx.room.runtime) + implementation(libs.com.google.devtools.ksp.gradle.plugin) + + ksp(libs.androidx.room.compiler) + + annotationProcessor(libs.androidx.room.compiler) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) diff --git a/app/src/main/java/usr/empty/player/MainActivity.kt b/app/src/main/java/usr/empty/player/MainActivity.kt index 1234f11..a43e8c3 100644 --- a/app/src/main/java/usr/empty/player/MainActivity.kt +++ b/app/src/main/java/usr/empty/player/MainActivity.kt @@ -36,8 +36,11 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.media3.common.util.UnstableApi +import androidx.room.Room import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json +import usr.empty.player.database.AppDatabase +import usr.empty.player.database.Track import usr.empty.player.ui.theme.PlayerTheme @@ -52,6 +55,12 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // Log.d("meow", "${filesDir.toPath().resolve("all_tracks.data")}") + val db = Room.databaseBuilder( + applicationContext, AppDatabase::class.java, "local" + ).allowMainThreadQueries().build() + Log.d("meow", "${db.trackDao().getAll()}") + if (!Environment.isExternalStorageManager()) { val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) val uri = Uri.fromParts("package", packageName, null) @@ -92,12 +101,21 @@ fun MainLayout(modifier: Modifier = Modifier) { audioUri?.run { uriToPath(this).let { MediaMetadataRetriever().apply { - setDataSource(it) - notas.add(NotaDescriptor(name = nullifyException { + setDataSource(it) // notas.add(NotaDescriptor(name = nullifyException { + // extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) + // } ?: it.split('/').last().split('.').first(), artist = nullifyException { + // extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST) + // } ?: "Unknown Artist", sourceType = NotaDescriptor.Source.LOCAL, source = it)) + val db = Room.databaseBuilder( + context.applicationContext, AppDatabase::class.java, "local" + ).allowMainThreadQueries().build() + db.trackDao().insertTrack(Track(title = nullifyException { extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) - } ?: it.split('/').last().split('.').first(), artist = nullifyException { - extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST) - } ?: "Unknown Artist", sourceType = NotaDescriptor.Source.LOCAL, source = it)) + } ?: it.split('/').last().split('.').first(), + artistId = 0, + albumId = null, + sourceType = NotaDescriptor.Source.LOCAL, + source = it)) } } } diff --git a/app/src/main/java/usr/empty/player/database/AppDatabase.kt b/app/src/main/java/usr/empty/player/database/AppDatabase.kt new file mode 100644 index 0000000..7abf5c6 --- /dev/null +++ b/app/src/main/java/usr/empty/player/database/AppDatabase.kt @@ -0,0 +1,11 @@ +package usr.empty.player.database + +import androidx.room.Database +import androidx.room.RoomDatabase + +@Database( + entities = [Track::class], version = 1 +) +abstract class AppDatabase : RoomDatabase() { + abstract fun trackDao(): TrackDao +} \ No newline at end of file diff --git a/app/src/main/java/usr/empty/player/database/Track.kt b/app/src/main/java/usr/empty/player/database/Track.kt new file mode 100644 index 0000000..1d064be --- /dev/null +++ b/app/src/main/java/usr/empty/player/database/Track.kt @@ -0,0 +1,41 @@ +package usr.empty.player.database + +import androidx.room.ColumnInfo +import androidx.room.Dao +import androidx.room.Entity +import androidx.room.Insert +import androidx.room.PrimaryKey +import androidx.room.Query +import usr.empty.player.NotaDescriptor +import java.util.UUID + +// a.k.a. Nota +@Entity +data class Track( + @ColumnInfo val title: String, + @ColumnInfo val artistId: Int, + @ColumnInfo val albumId: Int?, + @ColumnInfo val sourceType: NotaDescriptor.Source, + @ColumnInfo val source: String, +) { + @PrimaryKey(autoGenerate = true) + var uid: Int = 0 + + @ColumnInfo + var uuid: UUID = UUID.nameUUIDFromBytes("${title}${artistId}".toByteArray()) +} + +@Dao +interface TrackDao { + @Insert + fun insertTrack(track: Track) + + @Query("SELECT * FROM track") + fun getAll(): List + + @Query("SELECT * FROM track WHERE :artistId = artistId") + fun getByArtistId(artistId: Int): List + + @Query("SELECT * FROM track WHERE :albumId = albumId") + fun getByAlbumId(albumId: Int): List +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 922f551..fe40b95 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,4 +2,5 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false + id("com.google.devtools.ksp") version "2.0.20-1.0.25" apply false } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 031b62f..e094648 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,8 +5,9 @@ coreKtx = "1.13.1" kotlinxSerializationJson = "1.7.3" lifecycleRuntimeKtx = "2.8.6" activityCompose = "1.9.2" -composeBom = "2024.09.02" +composeBom = "2024.09.03" media3Exoplayer = "1.4.1" +roomRuntime = "2.6.1" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -17,13 +18,16 @@ androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "medi androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomRuntime" } +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" } androidx-ui = { group = "androidx.compose.ui", name = "ui" } androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } -androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version = "1.7.3" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } +com-google-devtools-ksp-gradle-plugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version = "2.0.20-1.0.25" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }