Created Shuffle table to store the shuffle settings #34

This commit is contained in:
amazing-username
2019-03-12 00:45:30 -04:00
committed by amazing-username
parent 22cd42dd69
commit 92d3270d91
6 changed files with 163 additions and 21 deletions
@@ -34,6 +34,8 @@ import com.example.mear.listeners.TrackElaspingChange
import com.example.mear.playback.service.MusicService import com.example.mear.playback.service.MusicService
import com.example.mear.models.PlayControls import com.example.mear.models.PlayControls
import com.example.mear.R import com.example.mear.R
import com.example.mear.constants.ControlTypes
import com.example.mear.repositories.ShuffleRepository
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
@@ -82,6 +84,7 @@ class MainActivity : AppCompatActivity() {
TrackElapsing.max = 100 TrackElapsing.max = 100
try { try {
initializeShuffle()
initializeServices() initializeServices()
initializeClickListeners() initializeClickListeners()
} }
@@ -115,18 +118,23 @@ class MainActivity : AppCompatActivity() {
} }
SettingsLink.setOnClickListener { SettingsLink.setOnClickListener {
val intent = Intent(this, SettingsActivity::class.java) val intent = Intent(this, SettingsActivity::class.java)
try { startActivity(intent)
startActivity(intent)
}
catch (ex: Exception) {
val exMsg = ex.message
println(exMsg)
}
} }
} }
private fun initializeServices() { private fun initializeServices() {
doBindService() 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() { private fun toggleShuffle() {
val shuffleText = ShuffleTracks.text.toString() val shuffleText = ShuffleTracks.text.toString()
@@ -146,6 +154,8 @@ class MainActivity : AppCompatActivity() {
ShuffleTracks.setText(R.string.shuffle_off) ShuffleTracks.setText(R.string.shuffle_off)
} }
} }
val playC = PlayControls(shuffleOn!!, null)
ShuffleRepository(this).updateShuffleMode(playC)
} }
private fun toggleRepeat() { private fun toggleRepeat() {
val repeatText = RepeatTrack.text.toString() val repeatText = RepeatTrack.text.toString()
@@ -185,8 +195,9 @@ class MainActivity : AppCompatActivity() {
private fun playNextSongTrack() { private fun playNextSongTrack() {
NextTrack.isEnabled = false NextTrack.isEnabled = false
try { try {
val controls = PlayControls(shuffleOn!!, repeatOn!!) //val controls = PlayControls(shuffleOn!!, repeatOn!!)
musicService!!.playNextTrack(controls) //musicService!!.playNextTrack(controls)
musicService!!.playNextTrack()
configureTrackDisplay() configureTrackDisplay()
} }
@@ -199,8 +210,9 @@ class MainActivity : AppCompatActivity() {
private fun playPreviousSongTrack() { private fun playPreviousSongTrack() {
PreviousTrack.isEnabled = false PreviousTrack.isEnabled = false
try { try {
val controls = PlayControls(shuffleOn!!, repeatOn!!) //val controls = PlayControls(shuffleOn!!, repeatOn!!)
musicService!!.playPreviousTrack(controls) //musicService!!.playPreviousTrack(controls)
musicService!!.playPreviousTrack()
configureTrackDisplay() configureTrackDisplay()
} }
@@ -231,7 +243,6 @@ class MainActivity : AppCompatActivity() {
if (mmr.embeddedPicture != null) { if (mmr.embeddedPicture != null) {
trackCover = mmr.embeddedPicture trackCover = mmr.embeddedPicture
} }
updateTrackProgress()
resetControls() resetControls()
@@ -259,7 +270,7 @@ class MainActivity : AppCompatActivity() {
TrackCover!!.imageBitmap = null TrackCover!!.imageBitmap = null
} }
private fun updateTrackProgress() { private fun updateTrackProgress() {
musicHandler!!.postDelayed(musicTrackTimeUpdateTask, 250) musicHandler!!.postDelayed(musicTrackTimeUpdateTask, 100)
} }
private fun configurePlayControlsDisplay() { private fun configurePlayControlsDisplay() {
PlayTrack.background = null PlayTrack.background = null
@@ -301,7 +312,7 @@ class MainActivity : AppCompatActivity() {
configureTrackDisplay() configureTrackDisplay()
} }
musicHandler!!.postDelayed(this, 250) musicHandler!!.postDelayed(this, 100)
} }
catch (ex: Exception) { catch (ex: Exception) {
val exMsg = ex.message val exMsg = ex.message
@@ -317,6 +328,7 @@ class MainActivity : AppCompatActivity() {
val demo = launch { val demo = launch {
musicService = (service as MusicService.LocalBinder).service musicService = (service as MusicService.LocalBinder).service
initializeChangeListeners() initializeChangeListeners()
updateTrackProgress()
} }
demo.start() demo.start()
} }
@@ -0,0 +1,6 @@
package com.example.mear.constants
object ControlTypes {
const val SHUFFLE_ON = "Shuffle On"
const val SHUFFLE_OFF = "Shuffle Off"
}
@@ -2,10 +2,15 @@ package com.example.mear.management
import android.content.Context import android.content.Context
import android.database.sqlite.SQLiteDatabase 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.*
import org.jetbrains.anko.db.ManagedSQLiteOpenHelper 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", class DatabaseManager(ctx: Context): ManagedSQLiteOpenHelper(ctx, "Mear",
null, 1) { null, 1) {
@@ -42,13 +47,19 @@ class DatabaseManager(ctx: Context): ManagedSQLiteOpenHelper(ctx, "Mear",
"TrackId" to INTEGER "TrackId" to INTEGER
) )
db!!.createTable( db!!.createTable(
"SettingsActivity", true, "Settings", true,
"Id" to INTEGER + PRIMARY_KEY + UNIQUE, "Id" to INTEGER + PRIMARY_KEY + UNIQUE,
"DarkTheme" to org.jetbrains.anko.db.REAL "DarkTheme" to org.jetbrains.anko.db.REAL
) )
db!!.createTable(
"Shuffle", true,
"Id" to INTEGER + PRIMARY_KEY + UNIQUE,
"Mode" to TEXT
)
} }
catch (ex: Exception) { catch (ex: Exception) {
} }
initializeShuffle(db)
} }
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { 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("Track")
db!!.dropTable("TrackCount") db!!.dropTable("TrackCount")
db!!.dropTable("PlayCount") db!!.dropTable("PlayCount")
db!!.dropTable("SettingsActivity") db!!.dropTable("Settings")
db!!.dropTable("Shuffle")
} }
catch (ex: Exception) { catch (ex: Exception) {
} }
} }
private fun initializeShuffle(db: SQLiteDatabase?) {
try {
db!!.insert("Shuffle",
"Mode" to ControlTypes.SHUFFLE_OFF)
}
catch (ex: Exception) {
val exMsg = ex.message
}
}
} }
@@ -1,4 +1,4 @@
package com.example.mear.models package com.example.mear.models
data class PlayControls(val shuffleOn: Boolean, val repeatOn: Boolean) { data class PlayControls(val shuffleOn: Boolean?, val repeatOn: Boolean?) {
} }
@@ -10,10 +10,12 @@ import android.widget.Toast
import java.lang.Exception import java.lang.Exception
import kotlin.random.Random import kotlin.random.Random
import com.example.mear.constants.ControlTypes
import com.example.mear.management.MusicFiles import com.example.mear.management.MusicFiles
import com.example.mear.management.TrackManager import com.example.mear.management.TrackManager
import com.example.mear.models.PlayControls import com.example.mear.models.PlayControls
import com.example.mear.models.Track import com.example.mear.models.Track
import com.example.mear.repositories.ShuffleRepository
import com.example.mear.repositories.TrackRepository import com.example.mear.repositories.TrackRepository
@@ -21,7 +23,7 @@ class MusicService: Service() {
private var trackPlayer: MediaPlayer? = null private var trackPlayer: MediaPlayer? = null
private var currentSongIndex: Int? = null private var currentSongIndex: Int? = null
private var shuffleOn: Boolean? = false private var shuffleOn: Boolean? = null
private var repeatOn: Boolean? = false private var repeatOn: Boolean? = false
private val mBinder = LocalBinder() private val mBinder = LocalBinder()
private val seconds = 4 private val seconds = 4
@@ -84,7 +86,21 @@ class MusicService: Service() {
} }
fun playPreviousTrack() { fun playPreviousTrack() {
try { 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) { catch (ex: Exception) {
val exMsg = ex.message val exMsg = ex.message
@@ -93,6 +109,7 @@ class MusicService: Service() {
fun playNextTrack() { fun playNextTrack() {
try { try {
trackPlayer!!.reset() trackPlayer!!.reset()
shuffleOn = retrieveShuffleMode()
var nextTrack = fetchSongIndex(PlayTypes.PlayNextSong) var nextTrack = fetchSongIndex(PlayTypes.PlayNextSong)
val track = TrackRepository(this).getTrack(nextTrack) val track = TrackRepository(this).getTrack(nextTrack)
trackPlayer!!.setDataSource(track.songPath) trackPlayer!!.setDataSource(track.songPath)
@@ -243,9 +260,47 @@ class MusicService: Service() {
val paths = mp3Paths.allSongs val paths = mp3Paths.allSongs
val trackMgr = TrackManager(paths!!) val trackMgr = TrackManager(paths!!)
trackMgr.configureTracks(this) 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? { private fun trackRepositoryEmpty(): Boolean? {
val trackCount = retrieveSongCount() val trackCount = retrieveSongCount()
@@ -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<String> {
override fun parseRow(columns: Map<String, Any?>): 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()
}
}