diff --git a/app/app.iml b/app/app.iml
index a44adb5..7fbd7e2 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -34,7 +34,7 @@
-
+
@@ -147,15 +147,15 @@
-
+
-
+
-
+
diff --git a/app/build.gradle b/app/build.gradle
index 15c5a0e..2b0ce57 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -48,7 +48,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.50"
+ implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:design:28.0.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1c7e68a..6b4add1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,7 +15,7 @@
@@ -23,15 +23,6 @@
-
-
-
+
+
diff --git a/app/src/main/cpp/Demo.hpp b/app/src/main/cpp/Demo.hpp
index 1b4657f..21227d3 100644
--- a/app/src/main/cpp/Demo.hpp
+++ b/app/src/main/cpp/Demo.hpp
@@ -271,24 +271,21 @@ void downloadSong(Song& song, const Token& token, const Str& path) {
repository::local::APIRepository apiRepo;
auto apiInfo = apiRepo.retrieveAPIInfo(path);
repository::SongRepository songRepo;
- auto downloadedSong = songRepo.downloadSong(token, song, apiInfo);
manager::DirectoryManager dirMgr;
if (dirMgr.doesSongExist(song, path)) {
std::cout << "song already exists\n";
return;
}
+ auto downloadedSong = songRepo.downloadSong(token, song, apiInfo);
+
dirMgr.createSongDirectory(song, path);
downloadedSong.path = dirMgr.fullSongPath(song, path);
std::fstream saveSong(downloadedSong.path, std::ios::out | std::ios::binary);
saveSong.write((char*)&downloadedSong.data[0], downloadedSong.data.size());
saveSong.close();
- repository::local::SongRepository localSongRepo;
- if (!localSongRepo.databaseExist(path)) {
- localSongRepo.initializedDatabase(path);
- }
-
+ repository::local::SongRepository localSongRepo(path);
if (!localSongRepo.doesTableExist(path)) {
localSongRepo.createSongTable(path);
}
@@ -405,7 +402,7 @@ Java_com_example_mear_repositories_TrackRepository_retrieveSongsIncludingDownloa
auto i = 0;
repository::local::SongRepository localSongRepo(appPath);
- auto localSongs = (localSongRepo.isTableEmpty(appPath)) ?
+ auto localSongs = (!localSongRepo.isTableEmpty(appPath)) ?
localSongRepo.retrieveAllSongs(appPath) : std::vector();
for (auto& sng: allSongs) {
diff --git a/app/src/main/cpp/repository/BaseRepository.h b/app/src/main/cpp/repository/BaseRepository.h
index e395070..9f55a34 100644
--- a/app/src/main/cpp/repository/BaseRepository.h
+++ b/app/src/main/cpp/repository/BaseRepository.h
@@ -52,11 +52,12 @@ namespace repository { namespace local {
queryStr.append(m_tableName);
SQLite::Statement query(db, queryStr);
- auto r = query.exec();
+
+ auto r = query.executeStep();
const auto result = query.hasRow();
- return result;
+ return !result;
} catch (std::exception& ex) {
auto msg = ex.what();
}
diff --git a/app/src/main/cpp/repository/SongRepository.h b/app/src/main/cpp/repository/SongRepository.h
index 02967bc..9716489 100644
--- a/app/src/main/cpp/repository/SongRepository.h
+++ b/app/src/main/cpp/repository/SongRepository.h
@@ -298,7 +298,6 @@ namespace repository {
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);
@@ -334,7 +333,7 @@ namespace repository {
query.bind(12, song.path);
query.bind(13, song.coverArtId);
- query.exec();
+ auto result = query.exec();
} catch (std::exception& ex) {
auto msg = ex.what();
}
diff --git a/app/src/main/cpp/repository/UserRepository.h b/app/src/main/cpp/repository/UserRepository.h
index 2f16444..df46041 100644
--- a/app/src/main/cpp/repository/UserRepository.h
+++ b/app/src/main/cpp/repository/UserRepository.h
@@ -34,11 +34,8 @@ namespace repository { namespace local {
auto result = query.executeStep();
- auto valZero = query.getColumn(1);
- auto valOne = query.getColumn(2);
-
- user.username = valZero.getString();
- user.password = valOne.getString();
+ user.username = std::move(query.getColumn(1).getString());
+ user.password = std::move(query.getColumn(2).getString());
return user;
diff --git a/app/src/main/java/com/example/mear/activities/MainActivity.kt b/app/src/main/java/com/example/mear/activities/MainActivity.kt
index 307f6b9..4996056 100644
--- a/app/src/main/java/com/example/mear/activities/MainActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/MainActivity.kt
@@ -27,7 +27,6 @@ import android.widget.Toast
import org.jetbrains.anko.imageBitmap
import com.example.mear.listeners.TrackElaspingChange
-import com.example.mear.models.Song
import com.example.mear.R
import com.example.mear.repositories.*
import com.example.mear.repositories.RepeatRepository.RepeatTypes
@@ -55,8 +54,6 @@ class MainActivity : BaseServiceActivity() {
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
- //permissionPrompt()
-
initialize()
}
catch (ex: Exception) {
@@ -358,7 +355,12 @@ class MainActivity : BaseServiceActivity() {
private fun showPopup(view: View) {
try {
var popup = PopupMenu(this, view)
- popup.inflate(R.menu.popup_menu)
+ if (musicService!!.getCurrentSong().downloaded) {
+ popup.inflate(R.menu.popup_menu_song_downloaded)
+ }
+ else {
+ popup.inflate(R.menu.popup_menu)
+ }
popup.setOnMenuItemClickListener{ item: MenuItem? ->
when (item!!.itemId) {
@@ -368,8 +370,11 @@ class MainActivity : BaseServiceActivity() {
R.id.action_song_view -> {
startActivity(Intent(this, IcarusSongActivity::class.java))
}
+ R.id.action_song_delete -> {
+ // TODO: handle song deletion
+ val ss = true
+ }
R.id.action_song_download -> {
- // TODO: implement download functionality
val appPath = appDirectory()
val apiRepo = APIRepository()
val tokenRepo = TokenRepository()
@@ -379,6 +384,10 @@ class MainActivity : BaseServiceActivity() {
val token = tokenRepo.retrieveToken(appPath)
val apiInfo = apiRepo.retrieveRecord(appPath)
trackRepo.download(token, song, appPath)
+ musicService!!.changeSongDownloadStatus()
+ // TODO: implement something to include the downloaded song into the songQueue
+ // essentially replacing the song that already exists, that way one can
+ // actually access the file without having to restart the app
}
R.id.action_song_play_count-> {
val trk = musicService!!.getCurrentSong()
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 8fd16d0..4438e6c 100644
--- a/app/src/main/java/com/example/mear/adapters/SongAdapter.kt
+++ b/app/src/main/java/com/example/mear/adapters/SongAdapter.kt
@@ -86,7 +86,6 @@ class SongAdapter(val mOnClickListener: (Song) -> Unit,
v.setOnClickListener { clickList(songItem!!)}
if (songItems.downloaded) {
- var rs = v.resources
v.setBackgroundColor(v.resources.getColor(R.color.track_seek))
}
}
diff --git a/app/src/main/java/com/example/mear/playback/service/MusicService.kt b/app/src/main/java/com/example/mear/playback/service/MusicService.kt
index cc6c4c2..43e5435 100644
--- a/app/src/main/java/com/example/mear/playback/service/MusicService.kt
+++ b/app/src/main/java/com/example/mear/playback/service/MusicService.kt
@@ -89,6 +89,17 @@ class MusicService(var appPath: String = ""): Service() {
}
}
+ fun changeSongDownloadStatus() {
+ currentSong.downloaded = true
+ songQueue.forEach {
+ s ->
+ if (s.id == currentSong.id) {
+ s.downloaded = true
+ }
+ }
+ // songQueue[currentSongIndex!!].downloaded = true
+ }
+
fun goToPosition(progress: Int) { trackPlayer!!.seekTo(progress) }
fun playSongTrack() {
@@ -225,7 +236,8 @@ class MusicService(var appPath: String = ""): Service() {
val token = tokenRepo.retrieveToken(appPath)
val apiInfo = apiRepo.retrieveRecord(appPath)
- val songs = trackRepo.fetchSongs(token, apiInfo.uri)
+ // val songs = trackRepo.fetchSongs(token, apiInfo.uri)
+ val songs = trackRepo.fetchSongsIncludingDownloaded(token, apiInfo.uri, appPath)
songQueue = songs.toMutableList()
if (retrieveShuffleMode()!!) {
@@ -280,6 +292,14 @@ class MusicService(var appPath: String = ""): Service() {
private fun offlinePlaySong(song: Song) {
try {
+ currentSong = song
+ songQueue.forEach{ s ->
+ if (s.id == currentSong.id) {
+ s.downloaded = currentSong.downloaded
+ s.filename = currentSong.filename
+ s.path = currentSong.path
+ }
+ }
trackPlayer!!.reset()
trackPlayer!!.setDataSource(song.path)
trackPlayer!!.prepare()
diff --git a/app/src/main/res/menu/popup_menu_song_downloaded.xml b/app/src/main/res/menu/popup_menu_song_downloaded.xml
new file mode 100644
index 0000000..c2a653c
--- /dev/null
+++ b/app/src/main/res/menu/popup_menu_song_downloaded.xml
@@ -0,0 +1,16 @@
+
+
\ 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 e7f7bee..435b107 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -38,6 +38,7 @@
Songs
Play Count
Download
+ Delete
About