From 4bf95cbe8b0ccc589033ed026cedbea22917a276 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Wed, 18 Dec 2019 20:18:42 -0500 Subject: [PATCH] Laying down some infrastructure for the Song database table. --- app/src/main/cpp/Demo.hpp | 10 ++ app/src/main/cpp/model/Song.h | 2 + app/src/main/cpp/repository/SongRepository.h | 144 +++++++++++++++++- app/src/main/cpp/repository/UserRepository.h | 2 +- .../com/example/mear/adapters/SongAdapter.kt | 4 + .../main/java/com/example/mear/models/Song.kt | 1 + 6 files changed, 159 insertions(+), 4 deletions(-) diff --git a/app/src/main/cpp/Demo.hpp b/app/src/main/cpp/Demo.hpp index c67740e..774bf15 100644 --- a/app/src/main/cpp/Demo.hpp +++ b/app/src/main/cpp/Demo.hpp @@ -66,6 +66,8 @@ Song ObjToSong(JE *env, SongObj obj) { auto songArtist = env->GetFieldID( songClass, "artist", "Ljava/lang/String;" ); auto songGenre = env->GetFieldID( songClass, "genre", "Ljava/lang/String;" ); auto songDuration = env->GetFieldID( songClass, "duration", "I" ); + auto songTrack = env->GetFieldID(songClass, "track", "I"); + auto songDisc = env->GetFieldID(songClass, "disc", "I"); auto songYear = env->GetFieldID( songClass, "year", "I" ); auto songCoverArtId = env->GetFieldID(songClass, "coverArtId", "I"); auto songPathId = env->GetFieldID(songClass, "path", "Ljava/lang/String;"); @@ -79,6 +81,8 @@ Song ObjToSong(JE *env, SongObj obj) { auto songArtistVal = (jstring)env->GetObjectField(obj, songArtist); auto songGenreVal = (jstring)env->GetObjectField(obj, songGenre); auto songDurationVal = env->GetIntField(obj, songDuration); + auto songTrackVal = env->GetIntField(obj, songTrack); + auto songDiscVal = env->GetIntField(obj, songDisc); auto songYearVal = env->GetIntField(obj, songYear); auto songCoverArtIdVal = env->GetIntField(obj, songCoverArtId); auto songPathVal = (jstring)env->GetObjectField(obj, songPathId); @@ -93,6 +97,8 @@ Song ObjToSong(JE *env, SongObj obj) { song.albumArtist = env->GetStringUTFChars(albumArtistVal, nullptr); song.genre = env->GetStringUTFChars(songGenreVal, nullptr); song.duration = songDurationVal; + song.track = songTrackVal; + song.disc = songDiscVal; song.year = songYearVal; song.coverArtId = songCoverArtIdVal; song.path = (songPathVal == nullptr) ? "" : env->GetStringUTFChars(songPathVal, nullptr); @@ -294,6 +300,8 @@ jobject songToObj(JNIEnv *env, const Song& song) { auto songGenre = env->GetFieldID( songClass, "genre", "Ljava/lang/String;" ); auto songYear = env->GetFieldID( songClass, "year", "I" ); auto songDuration = env->GetFieldID( songClass, "duration", "I" ); + auto songTrack = env->GetFieldID(songClass, "track", "I"); + auto songDisc = env->GetFieldID(songClass, "disc", "I"); auto songCoverArtId = env->GetFieldID(songClass, "coverArtId", "I"); auto songDownloadedId = env->GetFieldID(songClass, "downloaded", "Z"); auto songPathId = env->GetFieldID(songClass, "path", "Ljava/lang/String;"); @@ -310,6 +318,8 @@ jobject songToObj(JNIEnv *env, const Song& song) { env->SetObjectField(songObj, songGenre, env->NewStringUTF(song.genre.c_str())); env->SetIntField(songObj, songYear, song.year); env->SetIntField(songObj, songDuration, song.duration); + env->SetIntField(songObj, songTrack, song.track); + env->SetIntField(songObj, songDisc, song.disc); env->SetIntField(songObj, songCoverArtId, song.coverArtId); env->SetBooleanField(songObj, songDownloadedId, song.downloaded); env->SetObjectField(songObj, songPathId, songPath); diff --git a/app/src/main/cpp/model/Song.h b/app/src/main/cpp/model/Song.h index 84825ef..4d74b3d 100644 --- a/app/src/main/cpp/model/Song.h +++ b/app/src/main/cpp/model/Song.h @@ -32,6 +32,8 @@ namespace model { std::string albumArtist; std::string genre; int duration; + int track; + int disc; int year; int coverArtId; std::vector data; diff --git a/app/src/main/cpp/repository/SongRepository.h b/app/src/main/cpp/repository/SongRepository.h index 7a615ae..1786370 100644 --- a/app/src/main/cpp/repository/SongRepository.h +++ b/app/src/main/cpp/repository/SongRepository.h @@ -13,6 +13,7 @@ #include "../model/Song.h" #include "../model/Token.h" +#include "BaseRepository.h" #include "../utility/GeneralUtility.h" namespace repository { @@ -63,6 +64,8 @@ namespace repository { songJson["year"].get(), songJson["coverart_id"].get()); song.filename = ""; song.path = ""; + song.track = songJson["track"].get(); + song.disc = songJson["disc"].get(); song.downloaded = false; songs.push_back(song); @@ -112,6 +115,8 @@ namespace repository { s["album_artist"].get(), s["genre"].get(), s["duration"].get(), s["year"].get(), s["coverart_id"].get()); + song.track = s["track"].get(); + song.disc = s["disc"].get(); song.filename = ""; song.path = ""; song.downloaded = false; @@ -147,11 +152,11 @@ namespace repository { curl_easy_cleanup(curl); downloadedSong.data = std::move(std::vector(data.begin(), data.end())); downloadedSong.filename = "track"; - if (song.id < 10) { + if (song.track < 10) { downloadedSong.filename.append("0"); - downloadedSong.filename.append(std::to_string(song.id)); + downloadedSong.filename.append(std::to_string(song.track)); } else { - downloadedSong.filename.append(std::to_string(song.id)); + downloadedSong.filename.append(std::to_string(song.track)); } downloadedSong.filename.append(".mp3"); @@ -167,6 +172,139 @@ namespace repository { constexpr auto songDownloadEndpoint() noexcept { return "api/v1/song/data/"; } }; + + namespace local { + template + class SongRepository : public BaseRepository { + public: + SongRepository() { + m_tableName = songTable(); + } + + + std::vector retrieveAllSongs(const std::string& appPath) { + std::vector downloadedSongs; + try { + // TODO: left off here + + } catch (std::exception& ex) { + auto msg = ex.what(); + } + + return downloadedSongs; + } + + + Song retrieveSong(const Song& song, const std::string& appPath) { + Song retrievedSong; + + try { + const auto dbPath = pathOfDatabase(appPath); + SQLite::Database db(dbPath, SQLite::OPEN_READONLY); + + std::string queryString("SELECT * FROM "); + queryString.append(m_tableName); + queryString.append(" WHERE Id = ?"); + queryString.append(" LIMIT 1"); + + SQLite::Statement query(db, queryString); + query.bind(1, song.id); + auto result = query.executeStep(); + + retrievedSong.id = query.getColumn(0).getInt(); + retrievedSong.title = query.getColumn(1).getString(); + retrievedSong.artist = query.getColumn(2).getString(); + retrievedSong.album = query.getColumn(3).getString(); + retrievedSong.albumArtist = query.getColumn(4).getString(); + retrievedSong.genre = query.getColumn(5).getString(); + retrievedSong.year = query.getColumn(6).getInt(); + retrievedSong.duration = query.getColumn(7).getInt(); + retrievedSong.track = query.getColumn(8).getInt(); + retrievedSong.disc = query.getColumn(9).getInt(); + retrievedSong.filename = query.getColumn(10).getString(); + retrievedSong.path = query.getColumn(11).getString(); + retrievedSong.coverArtId = query.getColumn(12).getInt(); + retrievedSong.downloaded = true; + + } catch (std::exception& ex) { + auto msg = ex.what(); + } + + return retrievedSong; + } + + + void createSongTable(const std::string& appPath) { + try { + const auto dbPath = pathOfDatabase(appPath); + SQLite::Database db(dbPath, SQLite::OPEN_READWRITE); + + std::string queryString("CREATE TABLE "); + queryString.append(m_tableName); + queryString.append(" (Id INTEGER, Title TEXT, Artist TEXT, Album TEXT, "); + queryString.append("AlbumArtist TEXT, Genre TEXT, Year INTEGER, "); + queryString.append("Duration INTEGER, Track INTEGER, Disc INTEGER, "); + queryString.append("Filename TEXT, Path TEXT, CoverArtId INTEGER)"); + + db.exec(queryString); + } catch (std::exception& ex) { + auto msg = ex.what(); + } + } + + void deleteSongFromTable(const Song& song, const std::string& appPath) { + try { + const auto dbPath = pathOfDatabase(appPath); + SQLite::Database db(dbPath, SQLite::OPEN_READWRITE); + + std::string queryString("DELETE FROM "); + queryString.append(m_tableName); + queryString.append(" WHERE Id = ?"); + // queryString.append("Duration, Track, Disc, Filename, Path, CoverArtId)"); + SQLite::Statement query(db, queryString); + query.bind(1, song.id); + + query.exec(); + } catch (std::exception& ex) { + auto msg = ex.what(); + } + } + + void saveSong(const Song& song, const std::string& appPath) { + try { + const auto dbPath = pathOfDatabase(appPath); + SQLite::Database db(dbPath, SQLite::OPEN_READWRITE); + + std::string queryString("INSERT INTO "); + queryString.append(m_tableName); + queryString.append(" (Id, Title, Artist, Album, AlbumArtist, Genre, Year, "); + queryString.append("Duration, Track, Disc, Filename, Path, CoverArtId) "); + queryString.append("VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + + SQLite::Statement query(db, queryString); + query.bind(1, song.id); + query.bind(2, song.title); + query.bind(3, song.artist); + query.bind(4, song.album); + query.bind(5, song.albumArtist); + query.bind(6, song.genre); + query.bind(7, song.year); + query.bind(8, song.duration); + query.bind(9, song.track); + query.bind(10, song.disc); + query.bind(11, song.filename); + query.bind(12, song.path); + query.bind(13, song.coverArtId); + + query.exec(); + } catch (std::exception& ex) { + auto msg = ex.what(); + } + } + private: + constexpr auto songTable() noexcept { return "Song"; } + }; + } } diff --git a/app/src/main/cpp/repository/UserRepository.h b/app/src/main/cpp/repository/UserRepository.h index 460cfa5..2f16444 100644 --- a/app/src/main/cpp/repository/UserRepository.h +++ b/app/src/main/cpp/repository/UserRepository.h @@ -96,7 +96,7 @@ namespace repository { namespace local { } } private: - std::string userTable() noexcept { return "User"; } + const std::string userTable() noexcept { return "User"; } }; }} diff --git a/app/src/main/java/com/example/mear/adapters/SongAdapter.kt b/app/src/main/java/com/example/mear/adapters/SongAdapter.kt index 007cf09..3bc594e 100644 --- a/app/src/main/java/com/example/mear/adapters/SongAdapter.kt +++ b/app/src/main/java/com/example/mear/adapters/SongAdapter.kt @@ -94,6 +94,10 @@ class SongAdapter(val mOnClickListener: (Song) -> Unit, v.trackArtist.setText(songItems.albumArtist) v.setOnClickListener { clickList(songItem!!)} + if (songItems.downloaded) { + var rs = v.resources + v.setBackgroundColor(v.resources.getColor(R.color.track_seek)) + } } catch (ex: Exception) { val msg = ex.message diff --git a/app/src/main/java/com/example/mear/models/Song.kt b/app/src/main/java/com/example/mear/models/Song.kt index 9b6313a..eac0598 100644 --- a/app/src/main/java/com/example/mear/models/Song.kt +++ b/app/src/main/java/com/example/mear/models/Song.kt @@ -3,5 +3,6 @@ package com.example.mear.models class Song (var id: Int = 3, var title: String = "", var album: String = "", var albumArtist: String = "", var artist: String = "", var genre: String = "", var year: Int = 0, var duration: Int = 0, + var track: Int = 0, var disc: Int = 0, var coverArtId: Int = 0, var downloaded: Boolean = false, var path: String = "", var filename: String = "")