From 6a71da1540957d133930e10e9a09bfc69aede5c4 Mon Sep 17 00:00:00 2001 From: amazing-username Date: Sun, 10 Mar 2019 12:20:30 -0400 Subject: [PATCH] Implemented repeat functionality #23 and added functionality to change the current position of the song via the seekbar #27 --- .../example/mear/activities/MainActivity.kt | 47 +++++++------- .../mear/listeners/TrackElaspingChange.kt | 63 +++++++++++++++++++ .../mear/playback/service/MusicService.kt | 6 +- .../example/mear/util/ConvertTrackPosition.kt | 11 ++++ 4 files changed, 100 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/example/mear/listeners/TrackElaspingChange.kt create mode 100644 app/src/main/java/com/example/mear/util/ConvertTrackPosition.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 cd404ff..d485c5e 100644 --- a/app/src/main/java/com/example/mear/activities/MainActivity.kt +++ b/app/src/main/java/com/example/mear/activities/MainActivity.kt @@ -17,6 +17,8 @@ import android.widget.Toast import java.lang.Exception import java.lang.Runnable import java.util.concurrent.TimeUnit +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlin.io.* import kotlinx.android.synthetic.main.activity_main.* 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.imageBitmap +import com.example.mear.listeners.TrackElaspingChange import com.example.mear.playback.service.MusicService -import com.example.mear.R import com.example.mear.models.PlayControls -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking +import com.example.mear.R class MainActivity : AppCompatActivity() { @@ -88,6 +89,14 @@ class MainActivity : AppCompatActivity() { 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() { PlayTrack.setOnClickListener { playSongTrack() @@ -280,26 +289,20 @@ class MainActivity : AppCompatActivity() { 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) - ) - CurrentPosition.text = dur + val currentPosition = musicService!!.currentPositionOfTrack() / 1000 + val dur = String.format( "%02d:%02d", + TimeUnit.SECONDS.toMinutes(currentPosition.toLong()), + (currentPosition % 60) ) - TrackElapsing.progress = newPosition + CurrentPosition.text = dur - if (TrackCover.image == null && musicService!!.isPlaying()) { - configureTrackDisplay() + if (TrackCover.image == null && musicService!!.isPlaying()) { + configureTrackDisplay() + } + + musicHandler!!.postDelayed(this, 250) } - - musicHandler!!.postDelayed(this, 250) - } catch (ex: Exception) { val exMsg = ex.message } @@ -313,6 +316,7 @@ class MainActivity : AppCompatActivity() { runBlocking { val demo = launch { musicService = (service as MusicService.LocalBinder).service + initializeChangeListeners() } demo.start() } @@ -321,11 +325,6 @@ class MainActivity : AppCompatActivity() { configureTrackDisplay() } } - - Toast.makeText( - this@MainActivity, "Music Service Started", - Toast.LENGTH_SHORT - ).show() } override fun onServiceDisconnected(className: ComponentName) { diff --git a/app/src/main/java/com/example/mear/listeners/TrackElaspingChange.kt b/app/src/main/java/com/example/mear/listeners/TrackElaspingChange.kt new file mode 100644 index 0000000..06fa52a --- /dev/null +++ b/app/src/main/java/com/example/mear/listeners/TrackElaspingChange.kt @@ -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 + } + } + } +} \ 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 153beae..c06a6b8 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 @@ -5,13 +5,11 @@ import android.content.Intent import android.media.MediaPlayer import android.os.Binder import android.os.IBinder -import android.os.Looper import android.widget.Toast import java.lang.Exception import kotlin.random.Random -import com.example.mear.management.DatabaseManager import com.example.mear.management.MusicFiles import com.example.mear.management.TrackManager import com.example.mear.models.PlayControls @@ -65,7 +63,9 @@ class MusicService: Service() { } - + fun goToPosition(progress: Int) { + trackPlayer!!.seekTo(progress) + } fun playSongTrack() { try { trackPlayer!!.start() diff --git a/app/src/main/java/com/example/mear/util/ConvertTrackPosition.kt b/app/src/main/java/com/example/mear/util/ConvertTrackPosition.kt new file mode 100644 index 0000000..a1a7b83 --- /dev/null +++ b/app/src/main/java/com/example/mear/util/ConvertTrackPosition.kt @@ -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 + } +} \ No newline at end of file