From 92d3270d91fdde0554eb7c729fe8a05149260f47 Mon Sep 17 00:00:00 2001 From: amazing-username Date: Tue, 12 Mar 2019 00:45:30 -0400 Subject: [PATCH] Created Shuffle table to store the shuffle settings #34 --- .../example/mear/activities/MainActivity.kt | 40 ++++++++----- .../example/mear/constants/ControlTypes.kt | 6 ++ .../mear/management/DatabaseManager.kt | 30 ++++++++-- .../com/example/mear/models/PlayControls.kt | 2 +- .../mear/playback/service/MusicService.kt | 59 ++++++++++++++++++- .../mear/repositories/ShuffleRepository.kt | 47 +++++++++++++++ 6 files changed, 163 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/example/mear/constants/ControlTypes.kt create mode 100644 app/src/main/java/com/example/mear/repositories/ShuffleRepository.kt 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 e48d9bd..c267e02 100644 --- a/app/src/main/java/com/example/mear/activities/MainActivity.kt +++ b/app/src/main/java/com/example/mear/activities/MainActivity.kt @@ -34,6 +34,8 @@ import com.example.mear.listeners.TrackElaspingChange import com.example.mear.playback.service.MusicService import com.example.mear.models.PlayControls import com.example.mear.R +import com.example.mear.constants.ControlTypes +import com.example.mear.repositories.ShuffleRepository class MainActivity : AppCompatActivity() { @@ -82,6 +84,7 @@ class MainActivity : AppCompatActivity() { TrackElapsing.max = 100 try { + initializeShuffle() initializeServices() initializeClickListeners() } @@ -115,18 +118,23 @@ class MainActivity : AppCompatActivity() { } SettingsLink.setOnClickListener { val intent = Intent(this, SettingsActivity::class.java) - try { - startActivity(intent) - } - catch (ex: Exception) { - val exMsg = ex.message - println(exMsg) - } + startActivity(intent) } } private fun initializeServices() { doBindService() } + private fun initializeShuffle() { + val shuffleMode = ShuffleRepository(this).getShuffleMode() + when (shuffleMode) { + ControlTypes.SHUFFLE_ON -> { + ShuffleTracks.setText(R.string.shuffle_on) + } + ControlTypes.SHUFFLE_OFF -> { + ShuffleTracks.setText(R.string.shuffle_off) + } + } + } private fun toggleShuffle() { val shuffleText = ShuffleTracks.text.toString() @@ -146,6 +154,8 @@ class MainActivity : AppCompatActivity() { ShuffleTracks.setText(R.string.shuffle_off) } } + val playC = PlayControls(shuffleOn!!, null) + ShuffleRepository(this).updateShuffleMode(playC) } private fun toggleRepeat() { val repeatText = RepeatTrack.text.toString() @@ -185,8 +195,9 @@ class MainActivity : AppCompatActivity() { private fun playNextSongTrack() { NextTrack.isEnabled = false try { - val controls = PlayControls(shuffleOn!!, repeatOn!!) - musicService!!.playNextTrack(controls) + //val controls = PlayControls(shuffleOn!!, repeatOn!!) + //musicService!!.playNextTrack(controls) + musicService!!.playNextTrack() configureTrackDisplay() } @@ -199,8 +210,9 @@ class MainActivity : AppCompatActivity() { private fun playPreviousSongTrack() { PreviousTrack.isEnabled = false try { - val controls = PlayControls(shuffleOn!!, repeatOn!!) - musicService!!.playPreviousTrack(controls) + //val controls = PlayControls(shuffleOn!!, repeatOn!!) + //musicService!!.playPreviousTrack(controls) + musicService!!.playPreviousTrack() configureTrackDisplay() } @@ -231,7 +243,6 @@ class MainActivity : AppCompatActivity() { if (mmr.embeddedPicture != null) { trackCover = mmr.embeddedPicture } - updateTrackProgress() resetControls() @@ -259,7 +270,7 @@ class MainActivity : AppCompatActivity() { TrackCover!!.imageBitmap = null } private fun updateTrackProgress() { - musicHandler!!.postDelayed(musicTrackTimeUpdateTask, 250) + musicHandler!!.postDelayed(musicTrackTimeUpdateTask, 100) } private fun configurePlayControlsDisplay() { PlayTrack.background = null @@ -301,7 +312,7 @@ class MainActivity : AppCompatActivity() { configureTrackDisplay() } - musicHandler!!.postDelayed(this, 250) + musicHandler!!.postDelayed(this, 100) } catch (ex: Exception) { val exMsg = ex.message @@ -317,6 +328,7 @@ class MainActivity : AppCompatActivity() { val demo = launch { musicService = (service as MusicService.LocalBinder).service initializeChangeListeners() + updateTrackProgress() } demo.start() } diff --git a/app/src/main/java/com/example/mear/constants/ControlTypes.kt b/app/src/main/java/com/example/mear/constants/ControlTypes.kt new file mode 100644 index 0000000..46907be --- /dev/null +++ b/app/src/main/java/com/example/mear/constants/ControlTypes.kt @@ -0,0 +1,6 @@ +package com.example.mear.constants + +object ControlTypes { + const val SHUFFLE_ON = "Shuffle On" + const val SHUFFLE_OFF = "Shuffle Off" +} \ No newline at end of file diff --git a/app/src/main/java/com/example/mear/management/DatabaseManager.kt b/app/src/main/java/com/example/mear/management/DatabaseManager.kt index 7cafc3c..bb68933 100644 --- a/app/src/main/java/com/example/mear/management/DatabaseManager.kt +++ b/app/src/main/java/com/example/mear/management/DatabaseManager.kt @@ -2,10 +2,15 @@ package com.example.mear.management import android.content.Context import android.database.sqlite.SQLiteDatabase +import com.example.mear.constants.ControlTypes + +import java.lang.Exception import org.jetbrains.anko.db.* import org.jetbrains.anko.db.ManagedSQLiteOpenHelper -import java.lang.Exception + +import com.example.mear.models.PlayControls +import com.example.mear.repositories.ShuffleRepository class DatabaseManager(ctx: Context): ManagedSQLiteOpenHelper(ctx, "Mear", null, 1) { @@ -42,13 +47,19 @@ class DatabaseManager(ctx: Context): ManagedSQLiteOpenHelper(ctx, "Mear", "TrackId" to INTEGER ) db!!.createTable( - "SettingsActivity", true, + "Settings", true, "Id" to INTEGER + PRIMARY_KEY + UNIQUE, "DarkTheme" to org.jetbrains.anko.db.REAL ) + db!!.createTable( + "Shuffle", true, + "Id" to INTEGER + PRIMARY_KEY + UNIQUE, + "Mode" to TEXT + ) } catch (ex: Exception) { } + initializeShuffle(db) } override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { @@ -56,11 +67,22 @@ class DatabaseManager(ctx: Context): ManagedSQLiteOpenHelper(ctx, "Mear", db!!.dropTable("Track") db!!.dropTable("TrackCount") db!!.dropTable("PlayCount") - db!!.dropTable("SettingsActivity") - + db!!.dropTable("Settings") + db!!.dropTable("Shuffle") } catch (ex: Exception) { } } + + + private fun initializeShuffle(db: SQLiteDatabase?) { + try { + db!!.insert("Shuffle", + "Mode" to ControlTypes.SHUFFLE_OFF) + } + catch (ex: Exception) { + val exMsg = ex.message + } + } } diff --git a/app/src/main/java/com/example/mear/models/PlayControls.kt b/app/src/main/java/com/example/mear/models/PlayControls.kt index 7973ab1..ccca1d9 100644 --- a/app/src/main/java/com/example/mear/models/PlayControls.kt +++ b/app/src/main/java/com/example/mear/models/PlayControls.kt @@ -1,4 +1,4 @@ package com.example.mear.models -data class PlayControls(val shuffleOn: Boolean, val repeatOn: Boolean) { +data class PlayControls(val shuffleOn: Boolean?, val repeatOn: Boolean?) { } \ No newline at end of file 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 c06a6b8..9c954bb 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 @@ -10,10 +10,12 @@ import android.widget.Toast import java.lang.Exception import kotlin.random.Random +import com.example.mear.constants.ControlTypes import com.example.mear.management.MusicFiles import com.example.mear.management.TrackManager import com.example.mear.models.PlayControls import com.example.mear.models.Track +import com.example.mear.repositories.ShuffleRepository import com.example.mear.repositories.TrackRepository @@ -21,7 +23,7 @@ class MusicService: Service() { private var trackPlayer: MediaPlayer? = null private var currentSongIndex: Int? = null - private var shuffleOn: Boolean? = false + private var shuffleOn: Boolean? = null private var repeatOn: Boolean? = false private val mBinder = LocalBinder() private val seconds = 4 @@ -84,7 +86,21 @@ class MusicService: Service() { } fun playPreviousTrack() { try { - + val duration = trackPlayer!!.currentPosition / 1000 + shuffleOn = retrieveShuffleMode() + trackPlayer!!.reset() + if (duration > seconds) { + trackPlayer!!.setDataSource(TrackRepository(this).getTrack(currentSongIndex!!).songPath) + trackPlayer!!.prepare() + trackPlayer!!.start() + } + else { + val previousTrackNumber = fetchSongIndex(PlayTypes.PlayPreviousSong) + val track = TrackRepository(this).getTrack(previousTrackNumber) + trackPlayer!!.setDataSource(track.songPath) + trackPlayer!!.prepare() + trackPlayer!!.start() + } } catch (ex: Exception) { val exMsg = ex.message @@ -93,6 +109,7 @@ class MusicService: Service() { fun playNextTrack() { try { trackPlayer!!.reset() + shuffleOn = retrieveShuffleMode() var nextTrack = fetchSongIndex(PlayTypes.PlayNextSong) val track = TrackRepository(this).getTrack(nextTrack) trackPlayer!!.setDataSource(track.songPath) @@ -243,9 +260,47 @@ class MusicService: Service() { val paths = mp3Paths.allSongs val trackMgr = TrackManager(paths!!) trackMgr.configureTracks(this) + initializeShuffleMode() + } + private fun initializeShuffleMode() { + try { + val shuffleMode = ShuffleRepository(this).getShuffleMode() + when (shuffleMode) { + ControlTypes.SHUFFLE_ON -> { + shuffleOn = true + } + ControlTypes.SHUFFLE_OFF -> { + shuffleOn = false + } + null -> { + shuffleOn = false + } + } + } + catch (ex: Exception) { + val exMsg = ex.message + } } + private fun retrieveShuffleMode(): Boolean? { + val shuffleMode = ShuffleRepository(this).getShuffleMode() + when (shuffleMode) { + ControlTypes.SHUFFLE_ON -> { + return true + } + ControlTypes.SHUFFLE_OFF -> { + return false + } + null -> { + return null + } + else -> { + return false + } + } + } + private fun trackRepositoryEmpty(): Boolean? { val trackCount = retrieveSongCount() diff --git a/app/src/main/java/com/example/mear/repositories/ShuffleRepository.kt b/app/src/main/java/com/example/mear/repositories/ShuffleRepository.kt new file mode 100644 index 0000000..3feb6dd --- /dev/null +++ b/app/src/main/java/com/example/mear/repositories/ShuffleRepository.kt @@ -0,0 +1,47 @@ +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 + + + constructor(context: Context) { + this.context = context + } + + + fun getShuffleMode(): String = context!!.database.use { + select("Shuffle").limit(1) + .parseSingle(object : MapRowParser { + override fun parseRow(columns: Map): String { + + return columns.getValue("Mode").toString() + } + }) + } + + 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 updateShuffleMode(shuffleControls: PlayControls) = context!!.database.use { + var shuffleMode: String? = ControlTypes.SHUFFLE_OFF + if (shuffleControls.shuffleOn!!) { + shuffleMode = ControlTypes.SHUFFLE_ON + } + update("Shuffle", + "Mode" to shuffleMode).exec() + } +} \ No newline at end of file