Created Shuffle table to store the shuffle settings #34
This commit is contained in:
committed by
amazing-username
parent
22cd42dd69
commit
92d3270d91
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user