From 76a6a763c6f5927ae55aa9c6fd22a93ed59afbfa Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Tue, 5 Nov 2019 22:02:43 -0500 Subject: [PATCH] Implemented shuffle functionality. Not able to reproduce the bug with repeating the song. --- app/src/main/cpp/Demo.cpp | 56 +++++-- app/src/main/cpp/Demo.h | 3 +- app/src/main/cpp/ShuffleRepository.cpp | 93 ++++++++++++ app/src/main/cpp/ShuffleRepository.h | 18 ++- app/src/main/cpp/ShuffleTypes.h | 4 +- .../mear/activities/IcarusSongActivity.kt | 6 - .../example/mear/activities/MainActivity.kt | 63 +++----- .../mear/playback/service/MusicService.kt | 141 +++++------------- .../mear/repositories/BaseRepository.kt | 1 + .../mear/repositories/RepeatRepository.kt | 29 ---- .../mear/repositories/ShuffleRepository.kt | 56 +++---- 11 files changed, 239 insertions(+), 231 deletions(-) diff --git a/app/src/main/cpp/Demo.cpp b/app/src/main/cpp/Demo.cpp index 06ef48f..b715458 100644 --- a/app/src/main/cpp/Demo.cpp +++ b/app/src/main/cpp/Demo.cpp @@ -25,6 +25,7 @@ #include "APIRepository.h" #include "RepeatRepository.h" +#include "ShuffleRepository.h" #include "SongRepository.h" #include "Tok.h" #include "TokenRepository.h" @@ -92,15 +93,6 @@ model::APIInfo retrieveAPIInfo(const std::string& path) } -model::Song retrieveSong(const std::string& token, const std::string& baseUri, const int songId) -{ - repository::SongRepository songRepo; - model::Song song(songId, "Smooth", "Amaze", "The Herb", "Blazing", - 420, 420); - - return songRepo.retrieveSong(token, song, baseUri); -} - model::Song retrieveSong(const model::Token& token, const model::Song& song, const std::string& baseUri) { @@ -148,6 +140,18 @@ int retrieveRepeatMode(const std::string& path) return static_cast(repeatMode); } +int retrieveShuffleMode(const std::string& path) +{ + repository::local::ShuffleRepository shuffleRepo; + if (!shuffleRepo.doesTableExist(path)) { + shuffleRepo.createShuffleTable(path); + } + + auto shuffleMode = shuffleRepo.retrieveShuffleMode(path); + + return static_cast(shuffleMode); +} + bool doesDatabaseExist(const std::string& dataPath) { @@ -185,7 +189,7 @@ void saveAPIInfo(const model::APIInfo& apiInfo, const std::string& path) if (!apiRepo.databaseExist(path)) { apiRepo.initializedDatabase(path); } - if (!apiRepo.doesAPIInfoTableExist(path)) { + if (!apiRepo.doesTableExist(path)) { apiRepo.createAPiInfoTable(path); } if (!apiRepo.isTableEmpty(path)) { @@ -235,6 +239,12 @@ void updateRepeatMode(const std::string& path) repeatRepo.updateRepeat(path); } +void updateShuffleMode(const std::string& path) +{ + repository::local::ShuffleRepository shuffleRepo; + shuffleRepo.updateShuffle(path); +} + extern "C" JNIEXPORT jobjectArray @@ -422,6 +432,20 @@ Java_com_example_mear_repositories_RepeatRepository_retrieveRepeatMode( return repeatMode; } +extern "C" +JNIEXPORT jint +JNICALL +Java_com_example_mear_repositories_ShuffleRepository_retrieveShuffleMode( + JNIEnv *env, + jobject thisObj, + jstring pathStr + ) { + const auto dataPath = jstringToString(env, pathStr); + auto shuffleMode = retrieveShuffleMode(dataPath); + + return shuffleMode; +} + extern "C" JNIEXPORT jboolean @@ -555,4 +579,16 @@ Java_com_example_mear_repositories_RepeatRepository_updateRepeatMode( ) { const auto dataPath = jstringToString(env, pathStr); updateRepeatMode(dataPath); +} + +extern "C" +JNIEXPORT void +JNICALL +Java_com_example_mear_repositories_ShuffleRepository_updateShuffle( + JNIEnv *env, + jobject thisObj, + jstring pathStr + ) { + const auto dataPath = jstringToString(env, pathStr); + updateShuffleMode(dataPath); } \ No newline at end of file diff --git a/app/src/main/cpp/Demo.h b/app/src/main/cpp/Demo.h index 435215b..9c924d0 100644 --- a/app/src/main/cpp/Demo.h +++ b/app/src/main/cpp/Demo.h @@ -23,7 +23,6 @@ std::string jstringToString(JNIEnv*, jstring&); model::APIInfo retrieveAPIInfo(const std::string&); -model::Song retrieveSong(const std::string&, const std::string&, const int); model::Song retrieveSong(const model::Token&, const model::Song&, const std::string&); model::Token fetchToken(const model::User&, const std::string&); @@ -32,6 +31,7 @@ model::Token retrieveSavedToken(const std::string&); model::User retrieveCredentials(const std::string&); int retrieveRepeatMode(const std::string&); +int retrieveShuffleMode(const std::string&); bool doesDatabaseExist(const std::string&); bool apiInformationExist(const std::string&); @@ -42,6 +42,7 @@ void saveAPIInfo(const model::APIInfo&, const std::string&); void saveCredentials(const model::User&, const std::string&); void saveToken(const model::Token&, const std::string&); void updateRepeatMode(const std::string&); +void updateShuffleMode(const std::string&); diff --git a/app/src/main/cpp/ShuffleRepository.cpp b/app/src/main/cpp/ShuffleRepository.cpp index 1e24fae..5de129b 100644 --- a/app/src/main/cpp/ShuffleRepository.cpp +++ b/app/src/main/cpp/ShuffleRepository.cpp @@ -3,3 +3,96 @@ // #include "ShuffleRepository.h" + +namespace repository { namespace local { + ShuffleRepository::ShuffleRepository() { + m_tableName = shuffleTable(); + } + + + ShuffleTypes ShuffleRepository::retrieveShuffleMode(const std::string& path) { + try { + auto db = getDbConn(path, ConnType::ReadOnly); + std::string queryString("SELECT * FROM "); + queryString.append(m_tableName); + queryString.append(" LIMIT 1"); + + SQLite::Statement query(db, queryString); + + const auto result = query.executeStep(); + auto shuffleType = query.getColumn(1).getInt(); + auto val = static_cast(shuffleType); + + return val; + + } catch (std::exception &ex) { + auto msg = ex.what(); + } + + return ShuffleTypes::ShuffleOff; + } + + + void ShuffleRepository::createShuffleTable(const std::string& path) { + try { + auto db = getDbConn(path, ConnType::ReadWrite); + std::string queryString("CREATE TABLE "); + queryString.append(m_tableName); + queryString.append(" (Id INTEGER PRIMARY KEY, ShuffleMode INT)"); + + db.exec(queryString); + + queryString = "INSERT INTO "; + queryString.append(m_tableName); + queryString.append(" (ShuffleMode) VALUES(?)"); + SQLite::Statement query(db, queryString); + query.bind(1, static_cast(ShuffleTypes::ShuffleOff)); + query.exec(); + } catch (std::exception& ex) { + auto msg = ex.what(); + } + } + + void ShuffleRepository::updateShuffle(const std::string& path) { + try { + auto db = getDbConn(path, ConnType::ReadWrite); + + if (!doesTableExist(path)) { + createShuffleTable(path); + } + + if (isTableEmpty(path)) { + constexpr auto queryString = "INSERT INTO ? (ShuffleMode) VALUES(?)"; + SQLite::Statement query(db, queryString); + query.bind(1, m_tableName); + query.bind(2, static_cast(ShuffleTypes::ShuffleOff)); + query.exec(); + } else { + std::string queryString("UPDATE "); + queryString.append(m_tableName); + queryString.append(" SET ShuffleMode = ?"); + + auto shuffleMode = retrieveShuffleMode(path); + SQLite::Statement query(db, queryString); + + switch (shuffleMode) { + case ShuffleTypes::ShuffleOff: + query.bind(1, static_cast(ShuffleTypes::ShuffleOn)); + break; + case ShuffleTypes ::ShuffleOn: + query.bind(1, static_cast(ShuffleTypes::ShuffleOff)); + break; + default: + break; + } + + query.exec(); + } + } catch (std::exception& ex) { + auto msg = ex.what(); + } + } + + + std::string ShuffleRepository::shuffleTable() noexcept { return "Shuffle"; } +}} \ No newline at end of file diff --git a/app/src/main/cpp/ShuffleRepository.h b/app/src/main/cpp/ShuffleRepository.h index 52715a4..0f9a69e 100644 --- a/app/src/main/cpp/ShuffleRepository.h +++ b/app/src/main/cpp/ShuffleRepository.h @@ -5,10 +5,24 @@ #ifndef MEAR_SHUFFLEREPOSITORY_H #define MEAR_SHUFFLEREPOSITORY_H +#include -class ShuffleRepository { +#include "BaseRepository.h" +#include "ShuffleTypes.h" -}; +namespace repository { namespace local { + class ShuffleRepository : public BaseRepository { + public: + ShuffleRepository(); + + ShuffleTypes retrieveShuffleMode(const std::string&); + + void createShuffleTable(const std::string&); + void updateShuffle(const std::string&); + private: + std::string shuffleTable() noexcept; + }; +}} #endif //MEAR_SHUFFLEREPOSITORY_H diff --git a/app/src/main/cpp/ShuffleTypes.h b/app/src/main/cpp/ShuffleTypes.h index 67adbc5..a615ecb 100644 --- a/app/src/main/cpp/ShuffleTypes.h +++ b/app/src/main/cpp/ShuffleTypes.h @@ -6,8 +6,8 @@ #define MEAR_SHUFFLETYPES_H enum class ShuffleTypes { - ShuffleQueue = 0, - ShuffleOff + ShuffleOn = 0, + ShuffleOff = 1 }; #endif //MEAR_SHUFFLETYPES_H diff --git a/app/src/main/java/com/example/mear/activities/IcarusSongActivity.kt b/app/src/main/java/com/example/mear/activities/IcarusSongActivity.kt index 72da3bf..0c83dc7 100644 --- a/app/src/main/java/com/example/mear/activities/IcarusSongActivity.kt +++ b/app/src/main/java/com/example/mear/activities/IcarusSongActivity.kt @@ -1,19 +1,13 @@ package com.example.mear.activities -import android.os.Build import android.os.Bundle -import android.support.annotation.RequiresApi import android.support.v7.widget.LinearLayoutManager -import android.support.v7.app.AppCompatActivity import android.support.v7.widget.SearchView import kotlinx.android.synthetic.main.activity_icarus_song.* import kotlinx.android.synthetic.main.content_song_view.* -import com.example.mear.activities.BaseServiceActivity -import com.example.mear.adapters.RecyclerAdapter import com.example.mear.adapters.SongAdapter -import com.example.mear.models.TrackItems import com.example.mear.models.APIInfo import com.example.mear.models.Song import com.example.mear.models.Token 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 12146e6..33f8211 100644 --- a/app/src/main/java/com/example/mear/activities/MainActivity.kt +++ b/app/src/main/java/com/example/mear/activities/MainActivity.kt @@ -26,16 +26,14 @@ import android.widget.PopupMenu import android.widget.Toast import org.jetbrains.anko.imageBitmap -import com.example.mear.constants.ControlTypes import com.example.mear.listeners.TrackElaspingChange -import com.example.mear.models.PlayControls -import com.example.mear.models.PlayCount import com.example.mear.models.Song import com.example.mear.R import com.example.mear.repositories.PlayCountRepository import com.example.mear.repositories.RepeatRepository import com.example.mear.repositories.RepeatRepository.RepeatTypes import com.example.mear.repositories.ShuffleRepository +import com.example.mear.repositories.ShuffleRepository.ShuffleTypes class MainActivity : BaseServiceActivity() { @@ -149,14 +147,15 @@ class MainActivity : BaseServiceActivity() { doBindService() } private fun initializeShuffle() { - val shuffleMode = ShuffleRepository(this).getShuffleMode() + val shuffleRepo = ShuffleRepository(null) + val shuffleMode = shuffleRepo.shuffleMode(appDirectory()) when (shuffleMode) { - ControlTypes.SHUFFLE_ON -> { - ShuffleTracks.setText(R.string.shuffle_on) - } - ControlTypes.SHUFFLE_OFF -> { + ShuffleTypes.ShuffleOff -> { ShuffleTracks.setText(R.string.shuffle_off) } + ShuffleTypes.ShuffleOn -> { + ShuffleTracks.setText(R.string.shuffle_on) + } } } private fun initializeRepeat() { @@ -173,48 +172,23 @@ class MainActivity : BaseServiceActivity() { } private fun toggleShuffle() { - val shuffleText = ShuffleTracks.text.toString() - val on = getString(R.string.shuffle_on) - val off = getString(R.string.shuffle_off) - when (shuffleText) { - on -> { + val shuffleRepo = ShuffleRepository(null) + shuffleRepo.alterShuffleMode(appDirectory()) + val shuffleMode = shuffleRepo.shuffleMode(appDirectory()) + + when (shuffleMode) { + ShuffleTypes.ShuffleOff -> { shuffleOn = false - ShuffleTracks.setText(R.string.shuffle_off) + ShuffleTracks.text = getString(R.string.shuffle_off) } - off -> { + ShuffleTypes.ShuffleOn -> { shuffleOn = true - ShuffleTracks.setText(R.string.shuffle_on) - } - else -> { - shuffleOn = false - ShuffleTracks.setText(R.string.shuffle_off) + ShuffleTracks.text = getString(R.string.shuffle_on) } } - val playC = PlayControls(shuffleOn!!, null) - ShuffleRepository(this).updateShuffleMode(playC) } + private fun toggleRepeat() { - /** - val repeatText = RepeatTrack.text.toString() - val on = resources.getString(R.string.repeat_on) - val off = resources.getString(R.string.repeat_off) - when (repeatText) { - on -> { - repeatOn = false - RepeatTrack.text = off - } - off -> { - repeatOn = true - RepeatTrack.text = on - } - else -> { - repeatOn = false - RepeatTrack.text = off - } - } - val playC = PlayControls(null, repeatOn) - RepeatRepository(this).updateRepeatMode(playC) - */ val repeatRepo = RepeatRepository(null) val appPath = appDirectory() @@ -275,6 +249,8 @@ class MainActivity : BaseServiceActivity() { PreviousTrack.isEnabled = true playCountUpdated = false } + + override fun configureTrackDisplay() { try { runOnUiThread { @@ -372,6 +348,7 @@ class MainActivity : BaseServiceActivity() { private var musicTrackTimeUpdateTask = object: Runnable { override fun run() { try { + configureTrackDisplay() val currentPosition = musicService!!.currentPositionOfTrack() / 1000 val dur = String.format( "%02d:%02d", TimeUnit.SECONDS.toMinutes(currentPosition.toLong()), (currentPosition % 60) ) 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 c915dc4..1e4593a 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 @@ -4,26 +4,19 @@ import java.lang.Exception import kotlin.random.Random import android.app.Service -import android.content.Context import android.content.Intent import android.media.MediaPlayer -import android.net.Uri import android.os.Binder -import android.os.Environment import android.os.IBinder import android.widget.Toast -import com.example.mear.constants.ControlTypes import com.example.mear.constants.Interval -import com.example.mear.management.MusicFiles -import com.example.mear.management.TrackManager -import com.example.mear.models.PlayControls import com.example.mear.models.APIInfo import com.example.mear.models.Song import com.example.mear.models.Token -import com.example.mear.models.Track import com.example.mear.repositories.* import com.example.mear.repositories.RepeatRepository.RepeatTypes +import com.example.mear.repositories.ShuffleRepository.ShuffleTypes class MusicService(var appPath: String = ""): Service() { @@ -131,34 +124,30 @@ class MusicService(var appPath: String = ""): Service() { val token = tokenRepo.retrieveToken(appPath) val apiInfo = apiRepo.retrieveRecord(appPath) if (parseRepeatMode(repeatMode) || duration > seconds) { - /** - trackPlayer!!.setDataSource(this, - APIRepository.retrieveSongStreamUri(apiInfo, currentSong), - APIRepository.retrieveSongStreamHeader(token)) - */ - //trackPlayer!!.prepare() + trackPlayer!!.pause() trackPlayer!!.seekTo(0) trackPlayer!!.start() } else { - if (currentSongIndex == 0) { - currentSongIndex = songQueue.size - 1 - } - else { - currentSongIndex = currentSongIndex!! - 1 + if (retrieveShuffleMode()!! && !parseRepeatMode(repeatMode)) { + currentSongIndex = Random.nextInt(0, songQueue.size - 1) + } else if (!parseRepeatMode(repeatMode)) { + if (currentSongIndex == 0) { + currentSongIndex = songQueue.size - 1 + } else { + currentSongIndex = currentSongIndex!! - 1 + } } + currentSong = songQueue[currentSongIndex!!] val uri = APIRepository.retrieveSongStreamUri(apiInfo, currentSong) val hddr = APIRepository.retrieveSongStreamHeader(token) trackPlayer!!.reset() trackPlayer!!.setDataSource(this, uri, hddr) - /** - APIRepository.retrieveSongStreamUri(apiInfo, currentSong), - APIRepository.retrieveSongStreamHeader(token)) - */ + trackPlayer!!.prepare() trackPlayer!!.start() } @@ -179,19 +168,17 @@ class MusicService(var appPath: String = ""): Service() { val repeatMode = repeatRepo.repeatMode(appPath) val apiInfo = apiRepo.retrieveRecord(appPath) - /** - if (parseRepeatMode(repeatMode)) { - //trackPlayer!!.pause() - trackPlayer!!.seekTo(0) - //trackPlayer!!.start() - return - } - else*/ if ((currentSongIndex!! + 1) == songQueue.size) { - currentSongIndex = 0 - } - else { - currentSongIndex = currentSongIndex!! + 1 + if (retrieveShuffleMode()!! && !parseRepeatMode(repeatMode)) { + currentSongIndex = Random.nextInt(0, songQueue.size - 1) + } else if (!parseRepeatMode(repeatMode)) { + if ((currentSongIndex!! + 1) == songQueue.size) { + currentSongIndex = 0 + } + else { + currentSongIndex = currentSongIndex!! + 1 + } } + currentSong = songQueue[currentSongIndex!!] trackPlayer!!.setDataSource(this, @@ -205,13 +192,6 @@ class MusicService(var appPath: String = ""): Service() { } } - /** - fun configureControl(controls: PlayControls) { - shuffleOn = controls.shuffleOn - repeatOn = controls.repeatOn - } - */ - fun getCurrentSong(): Song { return currentSong } @@ -241,7 +221,12 @@ class MusicService(var appPath: String = ""): Service() { val songs = trackRepo.fetchSongs(token, apiInfo.uri) songQueue = songs.toMutableList() - currentSongIndex = Random.nextInt(0, songs.size - 1) + if (retrieveShuffleMode()!!) { + currentSongIndex = Random.nextInt(0, songs.size - 1) + } else { + currentSongIndex = 0 + } + currentSong = songQueue[currentSongIndex!!] trackPlayer!!.setDataSource(this, APIRepository.retrieveSongStreamUri(apiInfo, currentSong), @@ -256,55 +241,18 @@ class MusicService(var appPath: String = ""): Service() { } } - /** - private fun initializeShuffleMode() { - try { - val shuffleMode = ShuffleRepository(this).getShuffleMode() - when (shuffleMode) { - ControlTypes.SHUFFLE_ON -> { - shuffleOn = true - } - ControlTypes.SHUFFLE_OFF -> { - shuffleOn = false - } - } - } - catch (ex: Exception) { - val exMsg = ex.message - } - } - private fun initializeRepeatMode() { - try { - val repeatMode = RepeatRepository(this).getRepeatMode() - when (repeatMode) { - ControlTypes.REPEAT_ON -> { - repeatOn = true - } - ControlTypes.REPEAT_OFF -> { - repeatOn = false - } - } - } - catch (ex: Exception) { - val exMsg = ex.message - } - } - */ - private fun retrieveShuffleMode(): Boolean? { - val shuffleMode = ShuffleRepository(this).getShuffleMode() + val shuffleRepo = ShuffleRepository(null) + val shuffleMode = shuffleRepo.shuffleMode(appPath) + var shuffleOn = false + when (shuffleMode) { - ControlTypes.SHUFFLE_ON -> { - return true - } - ControlTypes.SHUFFLE_OFF -> { - return false - } - else -> { - return false - } + ShuffleTypes.ShuffleOn -> shuffleOn = true + ShuffleTypes.ShuffleOff -> shuffleOn = false } + + return shuffleOn } private fun parseRepeatMode(repeatMode: RepeatTypes): Boolean { @@ -316,21 +264,4 @@ class MusicService(var appPath: String = ""): Service() { return repeatOn!! } - - /** - private fun retrieveRepeatMode(): Boolean? { - val repeatMode = RepeatRepository(this).getRepeatMode() - when (repeatMode) { - ControlTypes.REPEAT_ON -> { - return true - } - ControlTypes.REPEAT_OFF -> { - return false - } - else -> { - return false - } - } - } - */ } diff --git a/app/src/main/java/com/example/mear/repositories/BaseRepository.kt b/app/src/main/java/com/example/mear/repositories/BaseRepository.kt index 1c77177..645258a 100644 --- a/app/src/main/java/com/example/mear/repositories/BaseRepository.kt +++ b/app/src/main/java/com/example/mear/repositories/BaseRepository.kt @@ -11,6 +11,7 @@ open class BaseRepository { private external fun doesDatabaseExist(path: String): Boolean + fun databaseExist(path: String): Boolean { return doesDatabaseExist(path) } diff --git a/app/src/main/java/com/example/mear/repositories/RepeatRepository.kt b/app/src/main/java/com/example/mear/repositories/RepeatRepository.kt index fb1accb..d95e426 100644 --- a/app/src/main/java/com/example/mear/repositories/RepeatRepository.kt +++ b/app/src/main/java/com/example/mear/repositories/RepeatRepository.kt @@ -2,12 +2,7 @@ package com.example.mear.repositories import android.content.Context -import org.jetbrains.anko.db.* - -import com.example.mear.constants.ControlTypes import com.example.mear.constants.CPPLib -import com.example.mear.database -import com.example.mear.models.PlayControls class RepeatRepository(var context: Context?) { @@ -23,19 +18,6 @@ class RepeatRepository(var context: Context?) { private external fun updateRepeatMode(path: String) - /** - fun getRepeatMode(): String = context!!.database.use { - select("Repeat").limit(1) - .parseSingle(object: MapRowParser{ - override fun parseRow(columns: Map): String { - - return columns.getValue("Mode").toString() - } - }) - } - - */ - fun repeatMode(path: String): RepeatTypes { val repeatType = RepeatTypes.valueOf(retrieveRepeatMode(path)) @@ -48,17 +30,6 @@ class RepeatRepository(var context: Context?) { } - /** - fun updateRepeatMode(playControls: PlayControls?) = context!!.database.use { - var repeatMode = ControlTypes.REPEAT_OFF - if (playControls!!.repeatOn!!) { - repeatMode = ControlTypes.REPEAT_ON - } - update("Repeat", - "Mode" to repeatMode).exec() - } - */ - enum class RepeatTypes(val value: Int) { RepeatSong(0), RepeatOff(1); diff --git a/app/src/main/java/com/example/mear/repositories/ShuffleRepository.kt b/app/src/main/java/com/example/mear/repositories/ShuffleRepository.kt index 073c61b..71105b4 100644 --- a/app/src/main/java/com/example/mear/repositories/ShuffleRepository.kt +++ b/app/src/main/java/com/example/mear/repositories/ShuffleRepository.kt @@ -2,51 +2,41 @@ package com.example.mear.repositories import android.content.Context -import org.jetbrains.anko.db.* - -import com.example.mear.constants.ControlTypes -import com.example.mear.database -import com.example.mear.models.PlayControls - -class ShuffleRepository { - private var context: Context? = null +import com.example.mear.constants.CPPLib - constructor(context: Context) { - this.context = context - } - +class ShuffleRepository(var context: Context?) { companion object { init { - System.loadLibrary("native-lib") + System.loadLibrary(CPPLib.NATIVE_LIB) } } - fun getShuffleMode(): String = context!!.database.use { - select("Shuffle").limit(1) - .parseSingle(object : MapRowParser { - override fun parseRow(columns: Map): String { - return columns.getValue("Mode").toString() - } - }) + + private external fun retrieveShuffleMode(path: String): Int + + private external fun updateShuffle(path: String) + + + fun shuffleMode(path: String): ShuffleTypes { + val shuffleType = ShuffleTypes.valueOf(retrieveShuffleMode(path)) + + return shuffleType!! } - fun insertShuffleMode(shuffleControls: PlayControls) = context!!.database.use { - var shuffleMode: String? = ControlTypes.SHUFFLE_OFF - if (shuffleControls.shuffleOn!!) { - shuffleMode = ControlTypes.SHUFFLE_ON - } - insert("Shuffle", - "Mode" to shuffleMode) + + fun alterShuffleMode(path: String) { + updateShuffle(path) } - fun updateShuffleMode(shuffleControls: PlayControls) = context!!.database.use { - var shuffleMode: String? = ControlTypes.SHUFFLE_OFF - if (shuffleControls.shuffleOn!!) { - shuffleMode = ControlTypes.SHUFFLE_ON + + enum class ShuffleTypes(val value: Int) { + ShuffleOn(0), + ShuffleOff(1); + + companion object { + fun valueOf(value: Int) = values().find { it.value == value } } - update("Shuffle", - "Mode" to shuffleMode).exec() } } \ No newline at end of file