Implemented repeat functionality #23 and added functionality to change the current position of the song via the seekbar #27

This commit is contained in:
amazing-username
2019-03-10 12:20:30 -04:00
committed by amazing-username
parent 3d7c293555
commit 6a71da1540
4 changed files with 100 additions and 27 deletions
@@ -17,6 +17,8 @@ import android.widget.Toast
import java.lang.Exception import java.lang.Exception
import java.lang.Runnable import java.lang.Runnable
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.io.* import kotlin.io.*
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_play_controls.* import kotlinx.android.synthetic.main.fragment_play_controls.*
@@ -28,11 +30,10 @@ import kotlinx.android.synthetic.main.fragment_track_flow.*
import org.jetbrains.anko.image import org.jetbrains.anko.image
import org.jetbrains.anko.imageBitmap import org.jetbrains.anko.imageBitmap
import com.example.mear.listeners.TrackElaspingChange
import com.example.mear.playback.service.MusicService import com.example.mear.playback.service.MusicService
import com.example.mear.R
import com.example.mear.models.PlayControls import com.example.mear.models.PlayControls
import kotlinx.coroutines.launch import com.example.mear.R
import kotlinx.coroutines.runBlocking
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
@@ -88,6 +89,14 @@ class MainActivity : AppCompatActivity() {
val exMsg = ex.message val exMsg = ex.message
} }
} }
private fun initializeChangeListeners() {
val newListener = TrackElaspingChange(TrackElapsing)
if (musicService != null) {
newListener.musicService = musicService
newListener.initialize()
TrackElapsing.setOnSeekBarChangeListener(newListener)
}
}
private fun initializeClickListeners() { private fun initializeClickListeners() {
PlayTrack.setOnClickListener { PlayTrack.setOnClickListener {
playSongTrack() playSongTrack()
@@ -280,26 +289,20 @@ class MainActivity : AppCompatActivity() {
private var musicTrackTimeUpdateTask = object: Runnable { private var musicTrackTimeUpdateTask = object: Runnable {
override fun run() { override fun run() {
try { try {
var newPosition = 0 val currentPosition = musicService!!.currentPositionOfTrack() / 1000
val currentPosition = musicService!!.currentPositionOfTrack() / 1000 val dur = String.format( "%02d:%02d",
val totalDuration = musicService!!.durationOfTrack() / 1000 TimeUnit.SECONDS.toMinutes(currentPosition.toLong()),
newPosition = (((currentPosition).toDouble() / totalDuration) * 100).toInt() (currentPosition % 60) )
val dur = String.format(
"%02d:%02d", TimeUnit.SECONDS.toMinutes(currentPosition.toLong()),
(currentPosition % 60)
)
CurrentPosition.text = dur
TrackElapsing.progress = newPosition CurrentPosition.text = dur
if (TrackCover.image == null && musicService!!.isPlaying()) { if (TrackCover.image == null && musicService!!.isPlaying()) {
configureTrackDisplay() configureTrackDisplay()
}
musicHandler!!.postDelayed(this, 250)
} }
musicHandler!!.postDelayed(this, 250)
}
catch (ex: Exception) { catch (ex: Exception) {
val exMsg = ex.message val exMsg = ex.message
} }
@@ -313,6 +316,7 @@ class MainActivity : AppCompatActivity() {
runBlocking { runBlocking {
val demo = launch { val demo = launch {
musicService = (service as MusicService.LocalBinder).service musicService = (service as MusicService.LocalBinder).service
initializeChangeListeners()
} }
demo.start() demo.start()
} }
@@ -321,11 +325,6 @@ class MainActivity : AppCompatActivity() {
configureTrackDisplay() configureTrackDisplay()
} }
} }
Toast.makeText(
this@MainActivity, "Music Service Started",
Toast.LENGTH_SHORT
).show()
} }
override fun onServiceDisconnected(className: ComponentName) { override fun onServiceDisconnected(className: ComponentName) {
@@ -0,0 +1,63 @@
package com.example.mear.listeners
import android.os.Handler
import android.widget.SeekBar
import java.lang.Exception
import java.util.concurrent.TimeUnit
import com.example.mear.playback.service.MusicService
import com.example.mear.util.ConvertTrackPosition
class TrackElaspingChange(var seekBar: SeekBar?): SeekBar.OnSeekBarChangeListener {
var musicService: MusicService? = null
var mHandler: Handler? = Handler()
override fun onStartTrackingTouch(seekBar: SeekBar?) {
this.seekBar = seekBar
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
this.seekBar = seekBar
val newPositionPercentage = this.seekBar!!.progress
var convertPosition = ConvertTrackPosition(newPositionPercentage)
val newPosition = convertPosition.newPosition(musicService!!.durationOfTrack())
musicService!!.goToPosition(newPosition)
this.seekBar!!.progress = newPosition
}
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
this.seekBar = seekBar
if (fromUser ){
mHandler!!.postDelayed( musicTrackTimeUpdateTask, 250)
}
}
fun initialize() {
mHandler!!.postDelayed(musicTrackTimeUpdateTask, 250)
}
private var musicTrackTimeUpdateTask = object: Runnable {
override fun run() {
try {
var newPosition = 0
val currentPosition = musicService!!.currentPositionOfTrack() / 1000
val totalDuration = musicService!!.durationOfTrack() / 1000
newPosition = (((currentPosition).toDouble() / totalDuration) * 100).toInt()
val dur = String.format(
"%02d:%02d", TimeUnit.SECONDS.toMinutes(currentPosition.toLong()),
(currentPosition % 60)
)
seekBar!!.progress = newPosition
mHandler!!.postDelayed(this, 250)
}
catch (ex: Exception) {
val exMsg = ex.message
}
}
}
}
@@ -5,13 +5,11 @@ import android.content.Intent
import android.media.MediaPlayer import android.media.MediaPlayer
import android.os.Binder import android.os.Binder
import android.os.IBinder import android.os.IBinder
import android.os.Looper
import android.widget.Toast import android.widget.Toast
import java.lang.Exception import java.lang.Exception
import kotlin.random.Random import kotlin.random.Random
import com.example.mear.management.DatabaseManager
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
@@ -65,7 +63,9 @@ class MusicService: Service() {
} }
fun goToPosition(progress: Int) {
trackPlayer!!.seekTo(progress)
}
fun playSongTrack() { fun playSongTrack() {
try { try {
trackPlayer!!.start() trackPlayer!!.start()
@@ -0,0 +1,11 @@
package com.example.mear.util
class ConvertTrackPosition(val percentage: Int) {
fun newPosition(trackDuration: Int): Int {
val newPosition = (trackDuration * (percentage.toDouble() / 100)).toInt()
return newPosition
}
}